/ Hex Artifact Content
Login

Artifact 8a02b1fb98eb11b9ce50cb3ab6a031f852b69303:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 73 74  Bt->mutex);.}.st
3ba0: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f  atic int cursorO
3bb0: 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75  wnsBtShared(BtCu
3bc0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
3bd0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3be0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74  utex(p) );.  ret
3bf0: 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e  urn (p->pBtree->
3c00: 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b  db==p->pBt->db);
3c10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3c20: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
3c30: 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f  overflow cache o
3c40: 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73  f the cursor pas
3c50: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
3c60: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e   argument..** on
3c70: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3c80: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3c90: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61  .*/.#define inva
3ca0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3cb0: 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d  che(pCur) (pCur-
3cc0: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
3cd0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f  CF_ValidOvfl)../
3ce0: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3cf0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3d00: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3d10: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3d20: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
3d30: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
3d40: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3d60: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
3d70: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
3d80: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3d90: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3da0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3db0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3dc0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3dd0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3de0: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3df0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3e00: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  (p);.  }.}..#ifn
3e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3e20: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54  INCRBLOB./*.** T
3e30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3e40: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f  called before mo
3e50: 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
3e60: 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a  ents of a table.
3e70: 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
3e80: 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
3e90: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f  rsors that are o
3ea0: 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f  pen on the.** ro
3eb0: 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  w or one of the 
3ec0: 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66  rows being modif
3ed0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ied..**.** If ar
3ee0: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3ef0: 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ble is true, the
3f00: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  n the entire con
3f10: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
3f20: 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74  table is about t
3f30: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e  o be deleted. In
3f40: 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c   this case inval
3f50: 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c  idate all incrbl
3f60: 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70  ob.** cursors op
3f70: 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69  en on any row wi
3f80: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77  thin the table w
3f90: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67  ith root-page pg
3fa0: 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  noRoot..**.** Ot
3fb0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75  herwise, if argu
3fc0: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3fd0: 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  e is false, then
3fe0: 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a   the row with.**
3ff0: 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62   rowid iRow is b
4000: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72  eing replaced or
4010: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
4020: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
4030: 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20  e.** only those 
4040: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
4050: 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70   open on that sp
4060: 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73  ecific row..*/.s
4070: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
4080: 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
4090: 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70  sors(.  Btree *p
40a0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Btree,          
40b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
40c0: 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
40d0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
40e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
40f0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
4100: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
4110: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
4120: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
4130: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
4140: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4150: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4160: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4170: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4180: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4190: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
41a0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
41b0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
41c0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
41d0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
41e0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
41f0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
4200: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4210: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
4220: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
4230: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
4240: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4250: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4260: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c   isClearTable ||
4270: 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
4280: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Row ){.        p
4290: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
42a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
42b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
42c0: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
42d0: 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e  function when IN
42e0: 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65  CRBLOB is omitte
42f0: 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69  d */.  #define i
4300: 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f  nvalidateIncrblo
4310: 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a  bCursors(x,y,z).
4320: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4330: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
4340: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74  /../*.** Set bit
4350: 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53   pgno of the BtS
4360: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4370: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69  t bitvec. This i
4380: 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65  s called .** whe
4390: 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72  n a page that pr
43a0: 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e  eviously contain
43b0: 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20  ed data becomes 
43c0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
43d0: 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   .** page..**.**
43e0: 20 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   The BtShared.pH
43f0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4400: 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20   exists to work 
4410: 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72  around an obscur
4420: 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20  e.** bug caused 
4430: 62 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69  by the interacti
4440: 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c  on of two useful
4450: 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IO optimization
4460: 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a  s surrounding.**
4470: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4480: 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  pages:.**.**   1
4490: 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  ) When all data 
44a0: 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
44b0: 61 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70  a page and the p
44c0: 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20  age becomes.**  
44d0: 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20      a free-list 
44e0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70  leaf page, the p
44f0: 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  age is not writt
4500: 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
4510: 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66  se.**      (as f
4520: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4530: 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d  ges contain no m
4540: 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e  eaningful data).
4550: 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20   Sometimes.**   
4560: 20 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69     such a page i
4570: 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e  s not even journ
4580: 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c  alled (as it wil
4590: 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  l not be modifie
45a0: 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62  d,.**      why b
45b0: 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e  other journallin
45c0: 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  g it?)..**.**   
45d0: 32 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c  2) When a free-l
45e0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
45f0: 20 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e   reused, its con
4600: 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64  tent is not read
4610: 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
4620: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72  e database or wr
4630: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4640: 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73  rnal file (why s
4650: 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20  hould it.**     
4660: 20 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f   be, if it is no
4670: 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67  t at all meaning
4680: 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20  ful?)..**.** By 
4690: 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73  themselves, thes
46a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
46b0: 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72  work fine and pr
46c0: 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a  ovide a handy.**
46d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
46e0: 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74  st to bulk delet
46f0: 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72  e or insert oper
4700: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
4710: 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73   if.** a page is
4720: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
4730: 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e  ee-list and then
4740: 20 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74   reused within t
4750: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73  he same.** trans
4760: 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65  action, a proble
4770: 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74  m comes up. If t
4780: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a  he page is not j
4790: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a  ournalled when.*
47a0: 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f  * it is moved to
47b0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
47c0: 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f  nd it is also no
47d0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
47e0: 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61  n it.** is extra
47f0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4800: 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73  ee-list and reus
4810: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ed, then the ori
4820: 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61  ginal data.** ma
4830: 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68  y be lost. In th
4840: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
4850: 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f  lback, it may no
4860: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a  t be possible.**
4870: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
4880: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
4890: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
48a0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
48b0: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68  e solution is th
48c0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
48d0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57  ontent bitvec. W
48e0: 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69  henever a page i
48f0: 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62  s .** moved to b
4900: 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73  ecome a free-lis
4910: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4920: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4930: 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20  it is.** set in 
4940: 74 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e  the bitvec. When
4950: 65 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65  ever a leaf page
4960: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
4970: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
4980: 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ,.** optimizatio
4990: 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69  n 2 above is omi
49a0: 74 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72  tted if the corr
49b0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
49c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
49d0: 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  in BtShared.pHas
49e0: 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e  Content. The con
49f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74  tents of the bit
4a00: 76 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a  vec are cleared.
4a10: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
4a20: 20 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69   every transacti
4a30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4a40: 74 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  t btreeSetHasCon
4a50: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4a60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4a70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4a80: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74  E_OK;.  if( !pBt
4a90: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4aa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
4ab0: 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b  o<=pBt->nPage );
4ac0: 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  .    pBt->pHasCo
4ad0: 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  ntent = sqlite3B
4ae0: 69 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d  itvecCreate(pBt-
4af0: 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  >nPage);.    if(
4b00: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4b10: 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
4b20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
4b30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
4b40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4b50: 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74  K && pgno<=sqlit
4b60: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74  e3BitvecSize(pBt
4b70: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29  ->pHasContent) )
4b80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
4b90: 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d  e3BitvecSet(pBt-
4ba0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67  >pHasContent, pg
4bb0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
4bc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51  n rc;.}../*.** Q
4bd0: 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65  uery the BtShare
4be0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65  d.pHasContent ve
4bf0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ctor..**.** This
4c00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4c10: 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d  led when a free-
4c20: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69  list leaf page i
4c30: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
4c40: 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  he.** free-list 
4c50: 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65  for reuse. It re
4c60: 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69  turns false if i
4c70: 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74  t is safe to ret
4c80: 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67  rieve the.** pag
4c90: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
4ca0: 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
4cb0: 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
4cc0: 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65  g set. True othe
4cd0: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
4ce0: 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73   int btreeGetHas
4cf0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d00: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4d10: 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d  ){.  Bitvec *p =
4d20: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
4d30: 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  t;.  return (p &
4d40: 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42  & (pgno>sqlite3B
4d50: 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20  itvecSize(p) || 
4d60: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
4d70: 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a  t(p, pgno)));.}.
4d80: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65  ./*.** Clear (de
4d90: 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61  stroy) the BtSha
4da0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4db0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f  bitvec. This sho
4dc0: 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65  uld be.** invoke
4dd0: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
4de0: 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74  ion of each writ
4df0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e-transaction..*
4e00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e10: 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
4e20: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4e30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ){.  sqlite3Bitv
4e40: 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70  ecDestroy(pBt->p
4e50: 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70  HasContent);.  p
4e60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4e70: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
4e80: 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  lease all of the
4e90: 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20   apPage[] pages 
4ea0: 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
4eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
4ec0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
4ed0: 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72  orPages(BtCursor
4ee0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
4ef0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
4f00: 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
4f10: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
4f20: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
4f30: 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  i]);.    pCur->a
4f40: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4f50: 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  }.  pCur->iPage 
4f60: 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  = -1;.}../*.** T
4f70: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
4f80: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
4f90: 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74  ument must point
4fa0: 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
4fb0: 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  y.** when this f
4fc0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4fd0: 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74  d (i.e. have eSt
4fe0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
4ff0: 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  D). This.** func
5000: 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63  tion saves the c
5010: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65  urrent cursor ke
5020: 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70  y in variables p
5030: 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a  Cur->nKey and.**
5040: 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c   pCur->pKey. SQL
5050: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5060: 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
5070: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
5080: 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  ror .** code oth
5090: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
50a0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
50b0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79  pen on an intkey
50c0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
50d0: 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20   integer key.** 
50e0: 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73  (the rowid) is s
50f0: 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e  tored in pCur->n
5100: 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b  Key and pCur->pK
5110: 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74  ey is left set t
5120: 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68  o.** NULL. If th
5130: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
5140: 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   on a non-intkey
5150: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75   table, then pCu
5160: 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73  r->pKey is .** s
5170: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
5180: 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72   malloced buffer
5190: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
51a0: 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
51b0: 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79  ning .** the key
51c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
51d0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74  saveCursorKey(Bt
51e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
51f0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
5200: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5210: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
5220: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
5230: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
5240: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5250: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5260: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5270: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5280: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5290: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
52a0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
52b0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
52c0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
52d0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
52e0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
52f0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
5300: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
5310: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
5320: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
5330: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5340: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5350: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5360: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5370: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5380: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5390: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
53a0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
53b0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
53c0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
53d0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
53e0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
53f0: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43    */.  if( 0==pC
5400: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5410: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
5420: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
5430: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20   pCur->nKey );. 
5440: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
5450: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5460: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
5470: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
5480: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
5490: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
54a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
54b0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
54c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
54e0: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
54f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5500: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5510: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
5520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
5530: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5540: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
5550: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5560: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5570: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5580: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
5590: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
55a0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
55b0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
55c0: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
55d0: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
55e0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
55f0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
5600: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
5610: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
5620: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
5630: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
5640: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
5650: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
5660: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
5670: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
5680: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5690: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
56a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
56b0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
56c0: 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52  eState || CURSOR
56d0: 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d  _SKIPNEXT==pCur-
56e0: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
56f0: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
5700: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
5710: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
5720: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28  (pCur) );..  if(
5730: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5740: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
5750: 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
5760: 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
5770: 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
5780: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
5790: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
57a0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70 43  saveCursorKey(pC
57b0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
57c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
57d0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
57e0: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
57f0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5800: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5810: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5820: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
5830: 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
5840: 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
5850: 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a  l|BTCF_AtLast);.
5860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5870: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5880: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
5890: 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
58a0: 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  NE saveCursorsOn
58b0: 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50  List(BtCursor*,P
58c0: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
58d0: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
58e0: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
58f0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
5900: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
5910: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
5920: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
5930: 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22  t-page iRoot.  "
5940: 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f  Saving the curso
5950: 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e  r position" mean
5960: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f  s that.** the lo
5970: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74  cation in the bt
5980: 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65  ree is remembere
5990: 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  d in such a way 
59a0: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a  that it can be.*
59b0: 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20  * moved back to 
59c0: 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66  the same spot af
59d0: 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61  ter the btree ha
59e0: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
59f0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
5a00: 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  e is called just
5a10: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70   before cursor p
5a20: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
5a30: 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20  o modify the.** 
5a40: 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70  table, for examp
5a50: 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74  le in BtreeDelet
5a60: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
5a70: 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rt()..**.** If t
5a80: 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
5a90: 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
5aa0: 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
5ab0: 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a  then all such .*
5ac0: 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64  * cursors should
5ad0: 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43 46   have their BTCF
5ae0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5af0: 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43 75  et.  The btreeCu
5b00: 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  rsor().** routin
5b10: 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74 20  e enforces that 
5b20: 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  rule.  This rout
5b30: 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74  ine only needs t
5b40: 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a  o be called in.*
5b50: 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63  * the uncommon c
5b60: 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63 74  ase when pExpect
5b70: 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d 75   has the BTCF_Mu
5b80: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5b90: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65 63  .**.** If pExpec
5ba0: 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e  t!=NULL and if n
5bb0: 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  o other cursors 
5bc0: 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65  are found on the
5bd0: 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c   same root-page,
5be0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54 43  .** then the BTC
5bf0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5c00: 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63 6c  on pExpect is cl
5c10: 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64 20  eared, to avoid 
5c20: 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74  another.** point
5c30: 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68 69  less call to thi
5c40: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
5c50: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5c60: 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75 74  note:  This rout
5c70: 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b  ine merely check
5c80: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20  s to see if any 
5c90: 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20  cursors.** need 
5ca0: 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49 74  to be saved.  It
5cb0: 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61   calls out to sa
5cc0: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5cd0: 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75 61  ) in the (unusua
5ce0: 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61 74  l).** event that
5cf0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 20   cursors are in 
5d00: 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73 61  need to being sa
5d10: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
5d20: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
5d30: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
5d40: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
5d50: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
5d60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
5d70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5d90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
5da0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
5db0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5dc0: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5dd0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5de0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5df0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5e00: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5e10: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5e20: 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  Root) ) break;. 
5e30: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65 74   }.  if( p ) ret
5e40: 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73 4f  urn saveCursorsO
5e50: 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20  nList(p, iRoot, 
5e60: 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28 20  pExcept);.  if( 
5e70: 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65 70  pExcept ) pExcep
5e80: 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  t->curFlags &= ~
5e90: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
5ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5eb0: 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65  K;.}../* This he
5ec0: 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20  lper routine to 
5ed0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20 64  saveAllCursors d
5ee0: 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77  oes the actual w
5ef0: 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a  ork of saving.**
5f00: 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66 20   the cursors if 
5f10: 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73 6f  and when a curso
5f20: 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  r is found that 
5f30: 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
5f40: 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65  s saving..** The
5f50: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20   common case is 
5f60: 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73 20  that no cursors 
5f70: 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64  need to be saved
5f80: 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
5f90: 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f  e is.** broken o
5fa0: 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c  ut from its call
5fb0: 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  er to avoid unne
5fc0: 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70 6f  cessary stack po
5fd0: 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a  inter movement..
5fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5ff0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
6000: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
6010: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c 20  .  BtCursor *p, 
6020: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
6030: 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61 74  irst cursor that
6040: 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a 2f   needs saving */
6050: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
6070: 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74 68  save cursor with
6080: 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61 76   this iRoot. Sav
6090: 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f  e all if zero */
60a0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
60b0: 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  cept    /* Do no
60c0: 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73  t save this curs
60d0: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20  or */.){.  do{. 
60e0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
60f0: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
6100: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
6110: 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Root) ){.      i
6120: 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
6130: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
6140: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6150: 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
6160: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
6170: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6180: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
6190: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
61a0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
61b0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
61c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
61d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
61e0: 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->iPage>0 );.   
61f0: 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
6200: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
6210: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6220: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
6230: 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
6240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6250: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6260: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
6270: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
6280: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6290: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
62a0: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
62b0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
62c0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
62d0: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
62e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
62f0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
6300: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
6310: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6320: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
6330: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
6340: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
6350: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
6360: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
6370: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
6380: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
6390: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
63a0: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
63b0: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
63c0: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
63d0: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
63e0: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
63f0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6400: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
6410: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
6420: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
6430: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
6440: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
6450: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
6460: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
6470: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
6480: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
6490: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
64a0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
64b0: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
64c0: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
64d0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
64e0: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
64f0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
6500: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
6510: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
6520: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
6530: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
6540: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6550: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6560: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
6570: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
6580: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
6590: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
65a0: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
65b0: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30    char aSpace[20
65c0: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
65d0: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
65e0: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
65f0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20  d a malloc */.  
6600: 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b  char *pFree = 0;
6610: 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
6620: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
6630: 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
6640: 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
6650: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
6660: 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
6670: 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  (.        pCur->
6680: 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65  pKeyInfo, aSpace
6690: 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
66a0: 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a  , &pFree.    );.
66b0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
66c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
66d0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
66e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
66f0: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
6700: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
6710: 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78  nKey, pKey, pIdx
6720: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  Key);.    if( pI
6730: 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30  dxKey->nField==0
6740: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6750: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
6760: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
6770: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
6780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6790: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BKPT;.    }.  }e
67a0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
67b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
67c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
67d0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
67e0: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
67f0: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20   bias, pRes);.  
6800: 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
6810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6820: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6830: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  b, pFree);.  }. 
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6850: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6860: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6870: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6880: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6890: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
68a0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
68b0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
68c0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
68d0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
68e0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
68f0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
6900: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
6910: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
6920: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
6930: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
6940: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
6950: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6960: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
6970: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
6980: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
6990: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
69a0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
69b0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
69c0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
69d0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
69e0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
69f0: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
6a00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6a10: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
6a20: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6a30: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6a40: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6a50: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6a60: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6a70: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6a80: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6a90: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6aa0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6ab0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6ac0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
6ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
6ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
6b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6b70: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6b80: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6b90: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6ba0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6bc0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
6bd0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
6be0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
6bf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6c00: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
6c10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6c20: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6c30: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6c40: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6c50: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6c60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6c70: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6c80: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6c90: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6ca0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6cb0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6cc0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
6cd0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
6ce0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
6cf0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
6d00: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
6d10: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
6d20: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6d30: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6d40: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6d50: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6d60: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6d70: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6d80: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6d90: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6da0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6db0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6dc0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
6dd0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
6de0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
6df0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
6e00: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
6e10: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6e20: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6e30: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6e40: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6e50: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6e60: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6e70: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6e80: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6e90: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6ea0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6eb0: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6ec0: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
6ed0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
6ee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6ef0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
6f00: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
6f10: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
6f20: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6f30: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6f40: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6f50: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6f60: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6f70: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6f80: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6f90: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6fa0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6fb0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6fc0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
6fd0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
6fe0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
6ff0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
7000: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
7010: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
7020: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
7030: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
7040: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7050: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7060: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7070: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7080: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7090: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
70a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
70b0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
70c0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
70d0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
70e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
70f0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7100: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7110: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7120: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7130: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7140: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7150: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7160: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7170: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7180: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7190: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
71a0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
71b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
71c0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
71d0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
71e0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
71f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7200: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7210: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7220: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7230: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7240: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7250: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
7260: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
7270: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
7280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7290: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
72a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
72b0: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50  OR_HINTS./*.** P
72c0: 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20  rovide hints to 
72d0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
72e0: 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74   particular hint
72f0: 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20   given (and the 
7300: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62  type.** and numb
7310: 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67  er of the vararg
7320: 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73  s parameters) is
7330: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
7340: 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20  he eHintType.** 
7350: 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20  parameter.  See 
7360: 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  the definitions 
7370: 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e  of the BTREE_HIN
7380: 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64  T_* macros for d
7390: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
73a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
73b0: 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20  orHint(BtCursor 
73c0: 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74  *pCur, int eHint
73d0: 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a  Type, ...){.  /*
73e0: 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79   Used only by sy
73f0: 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69  stem that substi
7400: 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73  tute their own s
7410: 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f  torage engine */
7420: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7430: 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69   Provide flag hi
7440: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7450: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7460: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7470: 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  tFlags(BtCursor 
7480: 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20  *pCur, unsigned 
7490: 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d  x){.  assert( x=
74a0: 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c  =BTREE_SEEK_EQ |
74b0: 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c  | x==BTREE_BULKL
74c0: 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20  OAD || x==0 );. 
74d0: 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78   pCur->hints = x
74e0: 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
74f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7500: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
7510: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
7520: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
7530: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
7540: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
7550: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
7560: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
7570: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7580: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
7590: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
75a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
75b0: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
75c0: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
75d0: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
75e0: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
75f0: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
7600: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
7610: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
7620: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
7630: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
7640: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
7650: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
7660: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
7670: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
7680: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
7690: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
76a0: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
76b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
76c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
76d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
76e0: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
76f0: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
7700: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
7710: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
7720: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
7730: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
7740: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
7750: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
7760: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
7770: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
7780: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
7790: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
77a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
77b0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
77c0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
77d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
77e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
77f0: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
7800: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
7810: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
7820: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
7830: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
7840: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
7850: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7860: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
7870: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
7880: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
7890: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
78a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
78b0: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
78c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
78d0: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
78e0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
78f0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
7900: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
7910: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
7920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
7930: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
7940: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
7950: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
7960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
7970: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7980: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
7990: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
79a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
79b0: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
79c0: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
79d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
79e0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
79f0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7a10: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7a20: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
7a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7a40: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
7a50: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
7a60: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
7a70: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
7a80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7a90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7aa0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7ab0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7ac0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7ad0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7ae0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7af0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7b00: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7b10: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7b20: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7b30: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7b40: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7b50: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
7b60: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
7b70: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
7b80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
7b90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
7ba0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
7bb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
7bc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
7bd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
7be0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
7bf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7c00: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
7c10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7c20: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7c30: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7c40: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7c50: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7c60: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c80: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7c90: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7ca0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7cb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
7cc0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
7cd0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
7ce0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7cf0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
7d00: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
7d10: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7d20: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7d30: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7d40: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7d50: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7d60: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7d70: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7d80: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7da0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
7db0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7dc0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
7dd0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
7de0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
7df0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7e00: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
7e10: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7e20: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7e30: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7e40: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7e50: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7e60: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7e70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7e80: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7e90: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7ea0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
7eb0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
7ec0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
7ed0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
7ee0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
7ef0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
7f00: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
7f10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7f20: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7f30: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7f40: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7f60: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7f70: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7f80: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7f90: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7fa0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
7fb0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7fc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
7fd0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7fe0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
7ff0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8000: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8010: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8020: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8030: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8040: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8050: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8060: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8070: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8080: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8090: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
80a0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
80b0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
80c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
80d0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
80e0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
80f0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8100: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8120: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8130: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8140: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8150: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8160: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8170: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8180: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8190: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
81a0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
81b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
81c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
81d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
81e0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
81f0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8200: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8210: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8220: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8230: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8240: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8250: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8260: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8270: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8280: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8290: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
82a0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
82b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
82c0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
82d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
82e0: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
82f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8300: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
8310: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
8320: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
8330: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
8340: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
8350: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8360: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
8370: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
8380: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
8390: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
83a0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
83b0: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
83c0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
83d0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
83e0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
83f0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8400: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8410: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8420: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
8430: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
8440: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
8450: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
8460: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
8470: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
8480: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
8490: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
84a0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
84b0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
84c0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
84d0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
84e0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
84f0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
8500: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
8510: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
8520: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8530: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8540: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8550: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
8560: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8570: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8580: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
8590: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
85a0: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
85b0: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
85c0: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
85d0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
85e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
85f0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8600: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
8610: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8620: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
8630: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
8640: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
8650: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
8660: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
8670: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
8680: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
8690: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
86a0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
86b0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
86c0: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
86d0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
86e0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
86f0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8720: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8730: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8740: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8750: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8760: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8770: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8780: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8790: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
87a0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
87b0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
87c0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
87d0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
87e0: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
87f0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8800: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8810: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8820: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
8830: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
8840: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
8850: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
8860: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
8870: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
8880: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
8890: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
88a0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
88b0: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
88c0: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
88d0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
88e0: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
88f0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8900: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8910: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8920: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
8930: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
8940: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
8950: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
8960: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
8970: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
8980: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
8990: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
89a0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
89b0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
89c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
89d0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
89e0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
89f0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
8a00: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
8a10: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
8a20: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
8a30: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8a40: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
8a50: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8a60: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
8a70: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
8a80: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
8a90: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
8aa0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
8ab0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8ac0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
8ad0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8ae0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8af0: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
8b00: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
8b10: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8b20: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
8b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8b40: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8b50: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8b60: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
8b70: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8b80: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8b90: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8ba0: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
8bb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
8bc0: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
8bd0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
8be0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
8bf0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
8c00: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8c10: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8c20: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8c30: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8c40: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8c50: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8c60: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8c70: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8c80: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8c90: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8ca0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
8cb0: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
8cc0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8cd0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
8ce0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
8cf0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
8d00: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8d10: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8d20: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8d30: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8d40: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8d50: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8d60: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8d70: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8d80: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8d90: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8da0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8db0: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
8dc0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8de0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8df0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8e00: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8e10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8e20: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8e30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8e40: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8e50: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8e60: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8e70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8e80: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8e90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8ea0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8eb0: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
8ec0: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
8ed0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
8ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
8ef0: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
8f00: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
8f10: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
8f20: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
8f30: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
8f40: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
8f50: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
8f60: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
8f70: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
8f80: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8f90: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
8fa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
8fb0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8fc0: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
8fd0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8fe0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8ff0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9000: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9010: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9020: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9030: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9040: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9050: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9060: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9070: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
9080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
9090: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
90a0: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
90b0: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
90c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
90d0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
90e0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
90f0: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
9100: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
9110: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
9120: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9130: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9140: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9160: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9170: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9190: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
91a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
91b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
91c0: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
91d0: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
91e0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
91f0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9200: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9210: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9220: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
9230: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
9240: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9250: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9260: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9270: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
9280: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9290: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
92a0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
92b0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
92c0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
92d0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
92e0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
92f0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9300: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9310: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
9320: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9330: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9340: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
9350: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
9360: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
9370: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
9380: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
9390: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
93a0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
93b0: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
93c0: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
93d0: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
93e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
93f0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
9400: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
9410: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
9420: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
9430: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
9440: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
9450: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
9460: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
9470: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9480: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
9490: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
94a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
94b0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
94c0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
94d0: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
94e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9500: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
9510: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
9520: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
9530: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
9540: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
9550: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
9560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9580: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9590: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
95a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
95b0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
95c0: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
95d0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
95e0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
95f0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
9600: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
9610: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
9620: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
9630: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
9640: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
9650: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
9660: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
9670: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
9680: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
9690: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
96a0: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
96b0: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
96d0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
96e0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
96f0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9700: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9710: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9720: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9730: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9740: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
9750: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9760: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9770: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9780: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97a0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
97b0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
97c0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
97d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
97e0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
97f0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
9800: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9810: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9820: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9830: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9840: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9850: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9860: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9870: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9880: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9890: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
98a0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
98b0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
98c0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
98d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
98e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
98f0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
9900: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9910: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
9920: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
9930: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9940: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9950: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9960: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9970: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9980: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9990: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
99a0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
99b0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
99c0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
99d0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
99e0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
99f0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9a00: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9a10: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9a20: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9a30: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9a40: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9a50: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9a60: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9a70: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9a80: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9a90: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9aa0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9ab0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9ac0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9ad0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9ae0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9af0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9b00: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9b10: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9b20: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9b30: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9b40: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9b50: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9b60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9b70: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9b80: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9b90: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9ba0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9bb0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9bc0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9bd0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9be0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9bf0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9c00: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9c10: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9c20: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
9c30: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9c40: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9c50: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9c60: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
9c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9c80: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
9c90: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
9ca0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9cc0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9cd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
9ce0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
9cf0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9d00: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9d10: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
9d20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
9d30: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
9d40: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
9d50: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
9d60: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
9d70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
9d80: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
9d90: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
9da0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
9db0: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
9dc0: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
9dd0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
9de0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
9df0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
9e00: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
9e10: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
9e20: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
9e30: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
9e40: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
9e50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
9e60: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
9e70: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
9e80: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
9e90: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
9ea0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
9eb0: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
9ec0: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
9ed0: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
9ee0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
9ef0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
9f00: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9f10: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
9f20: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
9f30: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
9f40: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
9f50: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
9f60: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
9f70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
9fa0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
9fb0: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9fe0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
9ff0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a000: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
a010: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
a020: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a030: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
a040: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
a050: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
a060: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
a070: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
a080: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
a090: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
a0a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
a0b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
a0c0: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
a0d0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
a0e0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
a0f0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
a100: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
a110: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
a120: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
a130: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
a140: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
a150: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
a160: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
a170: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a180: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
a190: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a1a0: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
a1b0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
a1c0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
a1d0: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
a1e0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a1f0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a200: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a210: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a220: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
a230: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
a240: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
a250: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
a260: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
a270: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
a280: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
a290: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
a2a0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
a2b0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
a2c0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
a2d0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
a2e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
a2f0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
a300: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a310: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
a320: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a330: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a340: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
a350: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a360: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
a370: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a380: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a390: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
a3a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a3b0: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
a3c0: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
a3d0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
a3e0: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
a3f0: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
a400: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
a410: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a420: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a430: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
a440: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
a450: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a460: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
a470: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a480: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a490: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a4a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a4b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
a4c0: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
a4d0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a4e0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a4f0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
a500: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
a510: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a520: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a530: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
a540: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
a550: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
a560: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
a570: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a580: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
a590: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a5a0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
a5b0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
a5c0: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
a5d0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a5e0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a5f0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a600: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a610: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
a620: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a630: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a640: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a660: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a670: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a680: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a690: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a6a0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a6b0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a6c0: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a6d0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a6e0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a6f0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a700: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a710: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a720: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a730: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a740: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a750: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a760: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a770: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a780: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
a790: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a7a0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
a7b0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
a7c0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a7d0: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
a7e0: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
a7f0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a800: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a810: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
a820: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
a830: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a840: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
a850: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a860: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a870: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
a880: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
a890: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
a8a0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
a8b0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
a8c0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
a8d0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
a8e0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
a8f0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
a900: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
a910: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
a920: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
a930: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
a940: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
a950: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
a960: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
a970: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
a980: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
a990: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
a9a0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
a9b0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
a9c0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
a9d0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
a9e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
a9f0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
aa00: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
aa10: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
aa20: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
aa30: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
aa40: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
aa50: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
aa60: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
aa70: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
aa80: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70   pCell!=0 );.  p
aa90: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
aaa0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
aab0: 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
aac0: 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
aad0: 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67  ayload ){.    Pg
aae0: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
aaf0: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  te(&pCell[info.n
ab00: 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74  Size-4]);.    pt
ab10: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
ab20: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
ab30: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
ab40: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
ab50: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
ab60: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
ab70: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
ab80: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
ab90: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
aba0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
abb0: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
abc0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
abd0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
abe0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
abf0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
ac00: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
ac10: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
ac20: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
ac30: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a  ontent area..**.
ac40: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
ac50: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
ac60: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
ac70: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
ac80: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
ac90: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
aca0: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
acb0: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
acc0: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
acd0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
ace0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
acf0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
ad00: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
ad10: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
ad20: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
ad30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ad40: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
ad50: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
ad60: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
ad70: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ada0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
add0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
ade0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
ae10: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ae20: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae40: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
ae50: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
ae60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
ae70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
ae80: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
ae90: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
aea0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
aeb0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
aec0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
aed0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
aee0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
aef0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af00: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
af10: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
af20: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
af30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af40: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
af50: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
af60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
af70: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
af80: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
af90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
afa0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
afb0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
afc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
afd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
aff0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b000: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b020: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b030: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b040: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b060: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b070: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
b080: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b090: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b0a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b0b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b0c0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b0d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b0e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b0f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b100: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b110: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b120: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b130: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b140: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b150: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b160: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b170: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b180: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b190: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
b1a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
b1b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
b1c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
b1d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b1e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
b1f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
b200: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
b210: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
b220: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
b230: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
b240: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
b250: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
b260: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
b270: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
b280: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
b290: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
b2a0: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
b2b0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
b2c0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
b2d0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
b2e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
b2f0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
b300: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
b310: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b320: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
b330: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b340: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
b350: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
b360: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b370: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
b380: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
b390: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
b3a0: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
b3b0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
b3c0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b3d0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b3e0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
b3f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b400: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b410: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
b420: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
b430: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
b440: 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43  size = pPage->xC
b450: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
b460: 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  src[pc]);.    cb
b470: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
b480: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
b490: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
b4a0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b4b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b4c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b4d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b4e0: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
b4f0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
b500: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b510: 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b    testcase( cbrk
b520: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b530: 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
b540: 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62  e( pc+size==usab
b550: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75  leSize );.    pu
b560: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
b570: 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d  rk);.    if( tem
b580: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  p==0 ){.      in
b590: 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t x;.      if( c
b5a0: 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e  brk==pc ) contin
b5b0: 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d  ue;.      temp =
b5c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
b5d0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
b5e0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
b5f0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
b600: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b610: 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70      memcpy(&temp
b620: 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28  [x], &data[x], (
b630: 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b  cbrk+size) - x);
b640: 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d  .      src = tem
b650: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  p;.    }.    mem
b660: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
b670: 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29   &src[pc], size)
b680: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b690: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b6a0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
b6b0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
b6c0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
b6d0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
b6e0: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
b6f0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
b700: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
b710: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
b720: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
b730: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b740: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b750: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b760: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
b770: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
b780: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
b790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b7a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
b7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
b7d0: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
b7e0: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
b7f0: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
b800: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
b810: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
b820: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
b830: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
b840: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
b850: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
b860: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
b870: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
b880: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
b890: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
b8a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
b8b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
b8c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b8d0: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
b8e0: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
b8f0: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
b900: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
b910: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
b920: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
b930: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
b940: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
b950: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
b960: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
b970: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
b980: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
b990: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
b9a0: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
b9b0: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
b9c0: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
b9d0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
b9e0: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
b9f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ba00: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
ba10: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
ba20: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
ba30: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
ba40: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
ba50: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
ba60: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
ba70: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
ba80: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
ba90: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
baa0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
bab0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
bac0: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
bad0: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
bae0: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
baf0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
bb00: 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29    assert( pc>0 )
bb10: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
bb20: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bb30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
bb40: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
bb50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bb60: 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46   R-06866-39125 F
bb70: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c  reeblocks are al
bb80: 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69  ways connected i
bb90: 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a  n order of.    *
bba0: 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66  * increasing off
bbb0: 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  set. */.    if( 
bbc0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
bbd0: 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b  || pc<iAddr+4 ){
bbe0: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
bbf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bc00: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
bc10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  0;.    }.    /* 
bc20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
bc30: 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74  2710-53328 The t
bc40: 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20  hird and fourth 
bc50: 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20  bytes of each.  
bc60: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66    ** freeblock f
bc70: 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e  orm a big-endian
bc80: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
bc90: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
bca0: 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20  e freeblock.    
bcb0: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63  ** in bytes, inc
bcc0: 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74  luding the 4-byt
bcd0: 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
bce0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
bcf0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  (&aData[pc+2]);.
bd00: 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a      if( (x = siz
bd10: 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b  e - nByte)>=0 ){
bd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bd30: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
bd40: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
bd50: 0a 20 20 20 20 20 20 69 66 28 20 70 63 20 3c 20  .      if( pc < 
bd60: 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  pPg->cellOffset+
bd70: 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  2*pPg->nCell || 
bd80: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
bd90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
bda0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
bdb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bdc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bdd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c      }else if( x<
bde0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
bdf0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
be00: 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20  1498-58022 In a 
be10: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
be20: 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74  ee page, the tot
be30: 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  al.        ** nu
be40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
be50: 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e   fragments may n
be60: 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f  ot exceed 60. */
be70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61  .        if( aDa
be80: 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72  ta[hdr+7]>57 ) r
be90: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20  eturn 0;..      
bea0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
beb0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
bec0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
bed0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
bee0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
bef0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
bf00: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
bf10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
bf20: 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61  ata[iAddr], &aDa
bf30: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
bf40: 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d      aData[hdr+7]
bf50: 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20   += (u8)x;.     
bf60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bf70: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
bf80: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
bf90: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
bfa0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
bfb0: 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  .         ** for
bfc0: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
bfd0: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
bfe0: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
bff0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44      put2byte(&aD
c000: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
c010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
c020: 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20  urn &aData[pc + 
c030: 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41  x];.    }.    iA
c040: 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63  ddr = pc;.    pc
c050: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
c060: 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c  ta[pc]);.  }whil
c070: 65 28 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75  e( pc );..  retu
c080: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
c090: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
c0a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
c0b0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
c0c0: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
c0d0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
c0e0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
c0f0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
c100: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
c110: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
c120: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c130: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
c140: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
c150: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
c160: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
c170: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
c180: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
c190: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
c1a0: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
c1b0: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
c1c0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
c1d0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
c1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
c1f0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
c200: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
c210: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
c220: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
c230: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
c240: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
c250: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
c260: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
c270: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
c280: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
c290: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
c2a0: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
c2b0: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
c2c0: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
c2d0: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
c2e0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
c2f0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
c300: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
c310: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
c320: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
c330: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c340: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
c350: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
c360: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
c370: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
c380: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c390: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c3a0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
c3b0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c3c0: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
c3d0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
c3e0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
c3f0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c420: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
c430: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
c440: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
c470: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
c480: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
c490: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
c4a0: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
c4b0: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
c4c0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
c4d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c4e0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c4f0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c510: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
c520: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c530: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c540: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c550: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
c560: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
c570: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
c580: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c590: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
c5a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c5b0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
c5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c5d0: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
c5e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c5f0: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
c600: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
c610: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
c620: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
c630: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
c640: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
c650: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
c660: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
c670: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
c680: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
c690: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
c6a0: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
c6b0: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
c6c0: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
c6d0: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
c6e0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
c6f0: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
c700: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
c710: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
c720: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
c730: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
c740: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
c750: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
c760: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
c770: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
c780: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
c790: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
c7a0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
c7b0: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
c7c0: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
c7d0: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
c7e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c7f0: 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  5]);.  assert( t
c800: 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e  op<=(int)pPage->
c810: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c820: 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79  ); /* Prevent by
c830: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
c840: 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74  ) */.  if( gap>t
c850: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
c860: 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70  p==0 && pPage->p
c870: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d  Bt->usableSize==
c880: 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74  65536 ){.      t
c890: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
c8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
c8b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c8c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
c8d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
c8e0: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
c8f0: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
c900: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
c910: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
c920: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
c930: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
c940: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
c950: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
c960: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
c970: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
c980: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
c990: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
c9a0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
c9b0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
c9c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
c9d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
c9e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
c9f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
ca00: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
ca10: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
ca20: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
ca30: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
ca40: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
ca50: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
ca60: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
ca70: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
ca80: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
ca90: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
caa0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
cab0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
cac0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
cad0: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
cae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
caf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
cb00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cb10: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
cb20: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
cb30: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
cb40: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
cb50: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
cb60: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
cb70: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
cb80: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
cb90: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
cba0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
cbb0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
cbc0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
cbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
cbe0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
cbf0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
cc00: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
cc10: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
cc20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cc30: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
cc40: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
cc50: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
cc60: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
cc70: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
cc80: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
cc90: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
cca0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ccb0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
ccc0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
ccd0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
cce0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
ccf0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
cd00: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
cd10: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
cd20: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
cd30: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
cd40: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
cd50: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
cd60: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
cd70: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
cd80: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
cd90: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
cda0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
cdb0: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
cdc0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
cdd0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
cde0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
cdf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
ce00: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
ce10: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
ce20: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ce30: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
ce40: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
ce50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ce60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ce70: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
ce80: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
ce90: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
cea0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
ceb0: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
cec0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
ced0: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
cee0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
cef0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
cf00: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
cf10: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
cf20: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
cf30: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
cf40: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
cf50: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
cf60: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
cf70: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cf80: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
cf90: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
cfa0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
cfb0: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
cfc0: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
cfd0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
cfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
cff0: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
d000: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
d010: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
d020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d030: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
d040: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
d050: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
d060: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
d070: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d080: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
d090: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
d0a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d0b0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
d0c0: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
d0d0: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
d0e0: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
d110: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
d120: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
d130: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
d140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d160: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
d170: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
d180: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
d1b0: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
d1c0: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
d1d0: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
d200: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
d210: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
d220: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
d230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
d240: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
d250: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
d260: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
d270: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
d280: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
d290: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
d2a0: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
d2b0: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
d2c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
d2d0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
d2e0: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
d2f0: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
d300: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
d310: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
d320: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
d330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
d340: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d360: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
d370: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d390: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
d3a0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
d3b0: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
d3c0: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
d3d0: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
d3e0: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
d3f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d400: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
d410: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d420: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d430: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d440: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
d450: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
d460: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
d470: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
d480: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
d490: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
d4a0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
d4b0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
d4c0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
d4d0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
d4e0: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
d4f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
d500: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
d510: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
d520: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
d530: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
d540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
d550: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
d560: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
d570: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
d580: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
d590: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
d5a0: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
d5b0: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
d5c0: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
d5d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
d5e0: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
d5f0: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
d600: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
d610: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
d620: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
d630: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
d640: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
d650: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
d660: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
d670: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
d680: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
d690: 61 74 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26  ata[iPtr]))>0 &&
d6a0: 20 69 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74   iFreeBlk<iStart
d6b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
d6c0: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20  reeBlk<iPtr+4 ) 
d6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d6e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d6f0: 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c    iPtr = iFreeBl
d700: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
d710: 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20   iFreeBlk>iLast 
d720: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d730: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d740: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
d750: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
d760: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
d770: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
d780: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
d790: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
d7a0: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
d7b0: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
d7c0: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
d7d0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
d7e0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
d7f0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
d800: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
d810: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
d820: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
d830: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
d840: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
d850: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
d860: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
d870: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
d880: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
d890: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
d8a0: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
d8b0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
d8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d8d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
d8e0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
d8f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d900: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
d910: 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70      if( iEnd > p
d920: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
d930: 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53  eSize ) return S
d940: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d950: 50 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20  PT;.      iSize 
d960: 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b  = iEnd - iStart;
d970: 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20  .      iFreeBlk 
d980: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d990: 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20  [iFreeBlk]);.   
d9a0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
d9b0: 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20  iPtr is another 
d9c0: 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20  freeblock (that 
d9d0: 69 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e  is, if iPtr is n
d9e0: 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  ot the freelist.
d9f0: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69      ** pointer i
da00: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
da10: 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  r) then check to
da20: 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73   see if iStart s
da30: 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
da40: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
da50: 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a  he end of iPtr..
da60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
da70: 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20  Ptr>hdr+1 ){.   
da80: 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d     int iPtrEnd =
da90: 20 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65   iPtr + get2byte
daa0: 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b  (&data[iPtr+2]);
dab0: 0a 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45  .      if( iPtrE
dac0: 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a  nd+3>=iStart ){.
dad0: 20 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72          if( iPtr
dae0: 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74  End>iStart ) ret
daf0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
db00: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
db10: 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74   nFrag += iStart
db20: 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20   - iPtrEnd;.    
db30: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
db40: 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20   - iPtr;.       
db50: 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a   iStart = iPtr;.
db60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
db70: 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61    if( nFrag>data
db80: 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e  [hdr+7] ) return
db90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
dba0: 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68  BKPT;.    data[h
dbb0: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
dbc0: 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74    }.  if( iStart
dbd0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
dbe0: 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20  [hdr+5]) ){.    
dbf0: 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62  /* The new freeb
dc00: 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62  lock is at the b
dc10: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
dc20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
dc30: 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73  a,.    ** so jus
dc40: 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c  t extend the cel
dc50: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72  l content area r
dc60: 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74  ather than creat
dc70: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  e another.    **
dc80: 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20   freelist entry 
dc90: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21  */.    if( iPtr!
dca0: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
dcb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dcc0: 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74  KPT;.    put2byt
dcd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  e(&data[hdr+1], 
dce0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
dcf0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
dd00: 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d  r+5], iEnd);.  }
dd10: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73  else{.    /* Ins
dd20: 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65  ert the new free
dd30: 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66  block into the f
dd40: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70  reelist */.    p
dd50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  ut2byte(&data[iP
dd60: 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  tr], iStart);.  
dd70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
dd80: 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42  [iStart], iFreeB
dd90: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
dda0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
ddb0: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ], iSize);.  }. 
ddc0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
ddd0: 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ddf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
de00: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
de10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
de20: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
de30: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
de40: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
de50: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
de60: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
de70: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
de80: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
de90: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
dea0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
deb0: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
dec0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
ded0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
dee0: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
def0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
df00: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
df10: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
df20: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
df30: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
df40: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
df50: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
df60: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
df70: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
df80: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
df90: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
dfa0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
dfb0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
dfc0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
dfd0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
dfe0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dff0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
e000: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
e010: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
e020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e030: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
e040: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
e050: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
e060: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
e070: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
e080: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
e090: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
e0a0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
e0b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
e0c0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
e0d0: 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
e0e0: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e0f0: 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
e100: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
e110: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
e120: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
e130: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
e140: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
e150: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
e160: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
e170: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
e180: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
e190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
e1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
e1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
e1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e1e0: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
e1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
e200: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e210: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
e220: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
e230: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e240: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
e250: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
e260: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
e270: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
e280: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
e290: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
e2a0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
e2b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
e2c0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
e2d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
e2e0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
e2f0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e300: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  yLeaf = 0;.     
e310: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
e320: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  e = cellSizePtrN
e330: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20  oPayload;.      
e340: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e350: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e360: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  llPtrNoPayload;.
e370: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
e380: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
e390: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
e3a0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e3b0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
e3c0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
e3d0: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
e3e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
e3f0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d  NCE-OF: R-27225-
e400: 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66  53936 A value of
e410: 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   2 means the pag
e420: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
e430: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d  .    ** index b-
e440: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e450: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
e460: 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
e470: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e480: 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35  F: R-16571-11615
e490: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d   A value of 10 m
e4a0: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e4b0: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69   a leaf.    ** i
e4c0: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
e4d0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e4e0: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
e4f0: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
e500: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e510: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
e520: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
e530: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
e540: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e550: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
e560: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
e570: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
e580: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
e590: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e5a0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
e5b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
e5c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
e5d0: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
e5e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
e5f0: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
e600: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
e610: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
e620: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e630: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
e640: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
e650: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
e660: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
e670: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e680: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
e690: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
e6a0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
e6b0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
e6c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
e6d0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e6e0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
e6f0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
e700: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
e710: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
e720: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
e730: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
e740: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
e750: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
e760: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
e770: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
e780: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
e790: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
e7a0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
e7b0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
e7c0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
e7d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
e7e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
e7f0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
e800: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
e810: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
e820: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e830: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
e840: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e860: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e870: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e880: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
e890: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
e8a0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
e8b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e8c0: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
e8d0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e8e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e8f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e900: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
e910: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e920: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e930: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
e940: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
e950: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
e960: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e970: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
e980: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
e990: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
e9a0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
e9b0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
e9c0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
e9d0: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
e9e0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
e9f0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
ea00: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
ea10: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
ea20: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
ea30: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
ea40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
ea50: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
ea60: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
ea70: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
ea80: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
ea90: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
eaa0: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
eab0: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
eac0: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
ead0: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
eae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eaf0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
eb00: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
eb10: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
eb30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
eb40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
eb50: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
eb60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
eb70: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
eb80: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
eb90: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
eba0: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
ebb0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
ebc0: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
ebd0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
ebe0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
ebf0: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
ec00: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ec10: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
ec20: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
ec30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec40: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
ec50: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
ec60: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
ec70: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
ec80: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
ec90: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
eca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
ecb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
ecc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ecd0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
ece0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
ecf0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
ed00: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
ed10: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
ed20: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
ed30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ed40: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
ed50: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
ed60: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
ed70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
ed80: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
ed90: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
eda0: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
edb0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
edc0: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
edd0: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
ede0: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
edf0: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
ee00: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
ee10: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
ee20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
ee30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
ee40: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
ee50: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
ee60: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
ee70: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
ee80: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
ee90: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
eea0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
eeb0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
eec0: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
eed0: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
eee0: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
eef0: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ef00: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
ef10: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
ef20: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
ef30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ef40: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
ef50: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ef60: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
ef70: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
ef80: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
ef90: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
efa0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
efb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
efc0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
efd0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
efe0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
eff0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
f000: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
f010: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
f020: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
f030: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
f040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f050: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f060: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
f070: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
f080: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
f090: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f0a0: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
f0b0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
f0c0: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
f0d0: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
f0e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
f0f0: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
f100: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
f110: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
f120: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
f130: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
f140: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
f150: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
f160: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
f170: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
f180: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
f190: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f1a0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
f1b0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
f1c0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
f1d0: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
f1e0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
f1f0: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
f200: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
f210: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
f220: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
f230: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
f240: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f250: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
f260: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
f270: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
f280: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
f290: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
f2a0: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
f2b0: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
f2c0: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
f2d0: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
f2e0: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
f2f0: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
f300: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
f310: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
f320: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
f330: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
f340: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
f350: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f360: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
f370: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f390: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
f3a0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
f3b0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
f3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f3d0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
f3e0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
f3f0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
f400: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
f410: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
f420: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f430: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
f440: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
f450: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
f460: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f470: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
f480: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f490: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
f4a0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f4b0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f4c0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f4e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f4f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f500: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
f510: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f520: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
f530: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
f540: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
f550: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
f560: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
f570: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
f580: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f5a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
f5c0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
f5d0: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
f5e0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
f5f0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
f600: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
f610: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
f620: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
f630: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
f640: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f650: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
f660: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
f670: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
f680: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
f690: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
f6a0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
f6b0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
f6c0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
f6d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
f6e0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
f6f0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
f700: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
f710: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
f720: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
f730: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
f740: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
f750: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f760: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f770: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f780: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
f790: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
f7a0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
f7b0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
f7c0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
f7d0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
f7e0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
f7f0: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
f800: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
f810: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
f820: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
f830: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
f840: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
f850: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
f860: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f870: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f880: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
f890: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
f8a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
f8b0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
f8c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
f8d0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
f8e0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
f8f0: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
f900: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
f910: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
f920: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
f930: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
f940: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
f950: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
f960: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
f970: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
f980: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f990: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
f9a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f9b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
f9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
f9d0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
f9e0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
f9f0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
fa00: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
fa10: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
fa20: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
fa30: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
fa40: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
fa50: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
fa60: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
fa70: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
fa80: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
fa90: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
faa0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
fab0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
fac0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
fad0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
fae0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
faf0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
fb00: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
fb10: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
fb20: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
fb30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
fb40: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
fb50: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
fb60: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
fb70: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
fb80: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
fb90: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
fba0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
fbb0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
fbc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fbd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fbe0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
fbf0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
fc00: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
fc10: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
fc20: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
fc30: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
fc40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
fc50: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
fc60: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
fc70: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
fc80: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
fc90: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
fca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
fcb0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
fcc0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
fcd0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
fce0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
fcf0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
fd00: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
fd10: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
fd20: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fd30: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
fd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fd50: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
fd60: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
fd70: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
fd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fd90: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
fda0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fdb0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
fdc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
fde0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
fdf0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
fe00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
fe10: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
fe20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fe30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fe40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fe50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
fe60: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
fe70: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
fe80: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
fe90: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
fea0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
feb0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
fec0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
fed0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
fee0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
fef0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
ff00: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
ff10: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
ff20: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
ff30: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
ff40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ff50: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
ff60: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ff70: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
ff80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
ff90: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
ffa0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
ffb0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
ffc0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
ffd0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
ffe0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
fff0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
10000 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
10010 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
10020 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
10030 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
10040 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
10050 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
10060 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
10070 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
10080 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
10090 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
100a0 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
100b0 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
100c0 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
100d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
100e0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
100f0 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
10100 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
10110 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
10120 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
10130 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
10140 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
10150 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
10160 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
10170 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
10180 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
10190 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
101a0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
101b0 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
101c0 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
101d0 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
101e0 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
101f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
10200 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
10210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10220 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
10230 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
10240 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
10250 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
10260 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
10270 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
10280 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10290 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
102a0 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
102b0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
102c0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
102d0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
102e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
102f0 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
10300 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
10310 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
10320 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
10330 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
10340 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
10350 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
10360 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
10370 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
10380 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
10390 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
103a0 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
103b0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
103c0 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
103d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
103e0 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
103f0 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
10400 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
10410 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
10420 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
10430 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
10440 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
10450 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
10460 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
10470 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
10480 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
10490 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
104a0 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
104b0 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
104c0 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
104d0 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
104e0 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
104f0 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
10500 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
10510 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
10520 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
10540 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
10550 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
10560 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
10570 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
10580 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
10590 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
105a0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
105b0 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
105c0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
105d0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
105e0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
105f0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
10600 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
10610 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
10620 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
10630 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
10640 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
10650 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
10660 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
10670 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
10680 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10690 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
106a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
106b0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
106c0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
106d0 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
106e0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
106f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
10700 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10710 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10720 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10730 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
10740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10750 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
10760 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10770 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
10780 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10790 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
107a0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
107b0 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
107c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
107d0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
107e0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
107f0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10800 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
10810 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
10820 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
10830 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
10840 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10850 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10870 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10880 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
10890 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
108a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
108b0 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
108c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
108d0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
108e0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
108f0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
10900 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10910 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10920 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10930 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10940 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10950 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
10960 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
10970 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
10980 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
10990 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
109a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
109b0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
109c0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
109d0 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
109e0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
109f0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
10a00 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10a10 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10a20 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10a30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10a40 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10a50 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
10a60 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10a70 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
10a80 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
10a90 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
10aa0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
10ab0 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
10ac0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
10ad0 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
10ae0 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
10af0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
10b00 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
10b10 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
10b20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
10b30 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
10b40 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
10b50 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
10b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10b70 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
10b80 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
10b90 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
10ba0 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
10bb0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
10bc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10bd0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
10be0 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
10bf0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
10c00 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
10c10 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
10c20 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
10c30 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
10c40 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
10c50 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10c60 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
10c70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
10c80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
10c90 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
10cc0 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
10cd0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
10ce0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
10cf0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
10d00 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
10d10 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10d20 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
10d30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10d40 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
10d50 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
10d60 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10d90 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
10da0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
10db0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
10dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10dd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10de0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10df0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
10e00 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
10e10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
10e20 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
10e30 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
10e40 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
10e50 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
10e60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10e70 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
10e80 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
10e90 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
10ea0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
10eb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10ec0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
10ed0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
10ee0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
10ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10f00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
10f10 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
10f20 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
10f30 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
10f40 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
10f50 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
10f60 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
10f70 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10f80 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
10f90 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
10fa0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
10fb0 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
10fc0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10fd0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10fe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
10ff0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
11000 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
11010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11030 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
11040 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11050 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
11060 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
11070 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
11080 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
11090 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
110a0 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
110b0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
110c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
110d0 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
110e0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
110f0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
11100 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
11110 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
11120 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
11130 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
11140 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
11150 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
11160 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
11170 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
11180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11190 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
111a0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
111b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
111c0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
111d0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
111e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
111f0 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
11200 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20  ge_error:.  if( 
11210 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61  pCur ) pCur->iPa
11220 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65  ge--;.  testcase
11230 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
11240 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
11250 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
11260 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
11270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11280 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
11290 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
112a0 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
112b0 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
112c0 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
112d0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
112e0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e  oid releasePageN
112f0 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  otNull(MemPage *
11300 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
11310 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
11320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11330 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
11340 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
11350 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
11360 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11370 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11380 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11390 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
113a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
113b0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
113c0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
113d0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
113e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
113f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
11410 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
11420 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
11430 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69  DbPage);.}.stati
11440 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11450 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11460 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
11470 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  ) releasePageNot
11480 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  Null(pPage);.}..
11490 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75  /*.** Get an unu
114a0 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  sed page..**.** 
114b0 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
114c0 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67  like btreeGetPag
114d0 65 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64  e() with the add
114e0 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ition:.**.**   *
114f0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
11500 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20   already in use 
11510 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
11520 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74  urpose, immediat
11530 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65  ely.**      rele
11540 61 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72  ase it and retur
11550 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52  n an SQLITE_CURR
11560 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20  UPT error..**   
11570 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  *  Make sure the
11580 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20   isInit flag is 
11590 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20  clear.*/.static 
115a0 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73  int btreeGetUnus
115b0 65 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  edPage(.  BtShar
115c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
115d0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
115e0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
115f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11600 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
11610 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
11620 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
11630 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
11640 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
11650 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
11660 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11670 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
11680 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
11690 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
116a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65  .  int rc = btre
116b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
116c0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
116d0 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
116e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
116f0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
11700 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
11710 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
11720 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
11730 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11740 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
11750 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
11760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11770 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
11780 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
11790 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
117a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
117b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
117c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  ;.}.../*.** Duri
117d0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
117e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
117f0 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
11800 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
11810 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
11820 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
11830 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
11840 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
11850 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
11860 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
11870 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
11880 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
11890 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
118a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
118b0 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
118c0 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
118d0 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
118e0 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
118f0 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
11900 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
11910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
11920 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
11930 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
11940 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
11950 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
11960 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11970 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
11980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11990 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
119a0 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
119b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
119c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
119d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
119e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
119f0 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
11a00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
11a10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
11a20 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
11a30 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
11a40 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
11a50 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
11a60 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
11a70 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
11a80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
11a90 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
11aa0 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
11ab0 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
11ac0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
11ad0 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
11ae0 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
11af0 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
11b00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
11b10 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
11b20 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
11b30 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
11b40 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
11b50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
11b60 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
11b70 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
11b80 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
11b90 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
11ba0 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
11bb0 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
11bc0 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
11bd0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
11be0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
11bf0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
11c00 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
11c10 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
11c20 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
11c40 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11c50 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
11c60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11c70 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
11c80 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11c90 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
11ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11cb0 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
11cc0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
11cd0 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11ce0 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
11cf0 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
11d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
11d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
11d20 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
11d30 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11d50 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
11d60 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
11d70 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
11d80 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
11d90 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
11da0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
11db0 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
11dc0 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
11dd0 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
11de0 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
11df0 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
11e00 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
11e10 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
11e20 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
11e30 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
11e40 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
11e50 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
11e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
11e70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
11e80 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
11e90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
11ea0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
11eb0 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
11ec0 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
11ed0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
11ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
11ef0 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
11f00 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
11f10 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
11f20 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
11f30 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
11f40 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
11f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
11f60 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
11f70 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
11f80 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
11f90 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
11fa0 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
11fb0 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
11fc0 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
11fd0 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
11fe0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11ff0 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
12000 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
12010 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
12020 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
12030 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
12040 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
12050 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
12060 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
12070 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
12080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12090 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
120a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
120b0 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
120c0 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
120d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
120e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
120f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12100 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
12110 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
12120 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12130 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
12140 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
12150 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12160 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
12170 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
12180 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
12190 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
121a0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
121b0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
121c0 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
121d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
121e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
121f0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
12200 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
12210 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
12220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12240 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
12250 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
12260 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
12290 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
122a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
122b0 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
122c0 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
122d0 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
122e0 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
122f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12300 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12310 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
12320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
12330 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
12360 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
12370 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
12380 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
12390 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
123a0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
123b0 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
123c0 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
123d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
123e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
123f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
12400 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
12410 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
12420 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
12430 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
12440 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
12450 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
12460 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
12470 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
12480 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
12490 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
124a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124b0 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
124c0 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
124d0 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
124e0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
124f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
12500 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
12510 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
12540 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
12550 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
12580 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12590 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
125a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
125b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
125c0 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
125d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
125e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
125f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12600 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
12610 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
12620 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
12630 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
12640 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
12650 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
12660 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
12670 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
12680 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
12690 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
126a0 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
126b0 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
126c0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
126d0 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
126e0 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
126f0 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
12700 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
12710 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
12720 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
12730 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
12740 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
12750 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
12760 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
12770 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12780 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
12790 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
127a0 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
127b0 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
127c0 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
127d0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
127e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
127f0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
12800 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
12810 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
12820 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
12830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12840 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
12850 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
12860 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
12870 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
12880 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12890 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
128a0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
128b0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
128c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
128d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
128e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
128f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
12900 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
12910 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
12920 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
12930 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
12940 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
12950 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
12960 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
12970 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
12980 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
12990 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
129a0 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
129b0 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
129c0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
129d0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
129e0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
129f0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
12a00 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
12a10 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
12a20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
12a30 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
12a40 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
12a50 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
12a60 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
12a70 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
12a80 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
12a90 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
12aa0 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
12ab0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
12ac0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
12ad0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
12ae0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
12af0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
12b00 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
12b10 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
12b20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12b30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12b40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b60 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12b70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
12b80 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
12b90 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
12ba0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
12bb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12bc0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12bd0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12be0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
12c10 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
12c20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
12c30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
12c40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12c50 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12c70 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12c80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ca0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
12cb0 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
12cc0 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
12cd0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12ce0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12cf0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
12d00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12d10 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12d20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
12d30 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12d40 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12d50 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
12d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12d70 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
12d80 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
12d90 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
12da0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
12db0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
12dc0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
12dd0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
12de0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
12df0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
12e00 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12e10 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
12e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
12e30 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
12e40 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
12e50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
12e60 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
12e70 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
12e80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
12e90 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
12ea0 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
12eb0 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
12ed0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
12ee0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
12ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12f00 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
12f10 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
12f20 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
12f30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f40 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
12f50 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
12f60 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f70 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
12f80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
12f90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12fa0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12fc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12fe0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
12ff0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
13000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13010 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
13020 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
13030 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
13040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13060 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13070 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13080 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
130a0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
130b0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
130c0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
130d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
130e0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
130f0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
13100 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
13110 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
13120 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
13130 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
13140 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
13150 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
13160 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
13170 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
13180 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
13190 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
131a0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
131b0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
131c0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
131d0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
131e0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
131f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
13200 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
13210 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
13220 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13230 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
13240 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
13250 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
13260 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
13270 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
13280 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
13290 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
132a0 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
132b0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
132c0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
132d0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
132e0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
132f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
13300 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13310 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
13320 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13330 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
13340 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
13350 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
13360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13370 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
13380 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
13390 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
133a0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
133b0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
133c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
133d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
133e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
133f0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13400 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13410 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
13420 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
13430 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
13460 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
13470 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
13480 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
134a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
134b0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
134c0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
134d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
134e0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
134f0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
13500 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
13510 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
13520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13540 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
13550 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13560 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
13570 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
13580 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
13590 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
135a0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
135b0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
135c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
135d0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
135e0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
135f0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
13600 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
13610 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
13620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
13630 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
13640 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
13650 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13660 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
13670 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
13680 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
13690 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
136a0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
136b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
136c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
136d0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
136e0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
136f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
13700 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
13710 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
13720 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
13730 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
13740 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
13750 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
13760 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
13770 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
13780 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
13790 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
137a0 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
137b0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
137c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
137d0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
137e0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
137f0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
13800 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
13810 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
13820 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
13830 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13840 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
13850 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13860 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
13870 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
13880 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
13890 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
138a0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
138b0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
138c0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
138d0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
138e0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
138f0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
13900 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
13910 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
13920 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
13930 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
13940 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
13950 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
13960 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
13970 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
13980 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
13990 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
139a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
139b0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
139c0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
139d0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
139e0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
139f0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
13a00 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
13a10 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
13a20 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
13a30 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
13a40 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
13a50 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
13a60 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
13a70 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
13a80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13a90 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
13aa0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
13ab0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
13ac0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
13ad0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
13ae0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
13af0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
13b00 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
13b10 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
13b20 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
13b30 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
13b40 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
13b50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13b60 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
13b70 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
13b80 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
13b90 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13ba0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
13bb0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
13bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13bd0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
13be0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13bf0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
13c00 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
13c10 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
13c20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
13c30 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13c40 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
13c50 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
13c60 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
13c70 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13c80 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13c90 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13ca0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
13cb0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
13cc0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13cd0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
13ce0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
13cf0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
13d00 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
13d10 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
13d20 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
13d30 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
13d40 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
13d50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13d60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13d70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13d90 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
13da0 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
13db0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
13dc0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
13dd0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
13de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
13df0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
13e00 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13e10 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13e20 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
13e30 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
13e40 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13e50 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
13e60 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13e70 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13e80 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
13e90 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
13ea0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
13eb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13ec0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
13ed0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
13ee0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
13ef0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13f00 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
13f10 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
13f20 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
13f30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13f40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13f50 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
13f60 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13f80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13f90 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
13fa0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
13fb0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
13fc0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
13fd0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
13fe0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
13ff0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14000 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14010 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
14020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14030 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14040 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14050 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
14060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14070 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14080 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14090 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
140a0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
140b0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
140c0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
140d0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
140e0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
140f0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
14100 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
14110 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
14120 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
14130 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
14140 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
14150 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
14160 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
14170 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
14180 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
14190 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
141a0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
141b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
141c0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
141d0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
141e0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
141f0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
14200 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
14210 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
14220 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70  .        if( (up
14230 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29  tr)p->pBt<(uptr)
14240 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
14250 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
14260 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
14270 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
14280 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
14290 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
142a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
142b0 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
142c0 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29  >pNext && (uptr)
142d0 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
142e0 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b  <(uptr)p->pBt ){
142f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
14300 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
14310 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14320 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
14330 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
14340 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14350 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
14360 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
14370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14380 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
14390 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
143a0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
143b0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
143c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
143d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
143e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
143f0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
14400 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
14410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14420 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
14430 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
14440 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14450 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
14460 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
14470 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14480 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
14490 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
144a0 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
144b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
144c0 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
144d0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
144e0 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
144f0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
14500 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
14510 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
14520 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
14530 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
14540 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
14550 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
14560 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
14570 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
14580 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
14590 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
145a0 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
145b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
145c0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
145d0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
145e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
145f0 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
14600 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
14610 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
14620 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14630 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
14640 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
14650 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14660 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
14670 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14680 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
14690 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
146a0 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
146b0 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
146c0 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
146d0 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
146e0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
146f0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
14700 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
14710 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
14720 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
14730 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
14740 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
14750 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
14760 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
14770 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
14780 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
147a0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
147b0 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
147c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
147d0 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
147e0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
147f0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
14800 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
14810 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
14820 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
14830 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
14840 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
14850 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14860 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14870 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
14880 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14890 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
148a0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
148b0 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
148c0 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
148d0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
148e0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
148f0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
14900 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14910 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14920 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
14930 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
14940 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
14950 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14960 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14970 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
14980 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
14990 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
149a0 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
149b0 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
149c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
149d0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
149e0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
149f0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
14a00 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
14a10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14a20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14a30 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
14a40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
14a50 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
14a60 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
14a70 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
14a80 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14a90 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
14aa0 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
14ab0 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
14ac0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
14ad0 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
14ae0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
14af0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
14b00 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
14b10 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
14b20 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
14b30 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
14b40 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
14b50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
14b60 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
14b70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14b80 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
14b90 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
14ba0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
14bb0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
14bc0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
14bd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
14be0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
14bf0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
14c00 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
14c10 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
14c20 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
14c30 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
14c40 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
14c50 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
14c60 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
14c70 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
14c80 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
14c90 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
14ca0 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
14cb0 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
14cc0 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
14cd0 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
14ce0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
14cf0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
14d00 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
14d10 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
14d20 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
14d30 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
14d40 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
14d50 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
14d60 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
14d70 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
14d80 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
14d90 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
14da0 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
14db0 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
14dc0 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
14dd0 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
14de0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
14df0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
14e00 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
14e10 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
14e20 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
14e30 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
14e40 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
14e50 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14e60 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
14e70 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
14e80 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
14e90 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
14ea0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
14eb0 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
14ec0 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
14ed0 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
14ee0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
14ef0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
14f00 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
14f10 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
14f20 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
14f30 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
14f40 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
14f50 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
14f60 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
14f70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
14f80 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14f90 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
14fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
14fb0 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
14fc0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
14fd0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
14fe0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
14ff0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
15000 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
15010 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
15020 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
15030 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
15040 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
15050 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15060 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
15070 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
15080 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
15090 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
150a0 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
150b0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
150c0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
150d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
150e0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
150f0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
15100 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
15110 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
15120 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
15130 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15140 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15150 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15160 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15170 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
15180 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
15190 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
151a0 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
151b0 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
151c0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
151d0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
151e0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
151f0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
15200 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
15210 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
15220 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
15230 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
15240 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
15250 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
15260 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
15270 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15280 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
15290 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
152a0 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
152b0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
152c0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
152d0 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
152e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
152f0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
15300 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
15310 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
15320 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
15330 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
15340 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
15350 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
15360 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
15370 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
15380 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
15390 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
153a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
153b0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
153c0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
153d0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
153e0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
153f0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
15400 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
15410 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
15420 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
15430 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
15440 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
15450 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
15460 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
15470 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
15480 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
15490 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
154a0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
154b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
154c0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
154d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
154e0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
154f0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
15500 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
15510 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
15520 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
15530 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
15540 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
15550 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15560 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
15570 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
15580 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
15590 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
155a0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
155b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
155c0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
155d0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
155e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
155f0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
15600 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
15610 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
15620 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
15630 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
15640 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
15650 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
15660 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
15670 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15680 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15690 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
156a0 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
156b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
156c0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
156d0 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
156e0 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
156f0 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
15700 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
15710 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
15720 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
15730 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
15740 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
15750 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
15760 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
15770 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
15780 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
15790 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
157a0 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
157b0 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
157c0 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
157d0 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
157e0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
157f0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
15800 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15810 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
15820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15830 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
15840 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
15850 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
15860 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15870 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
15880 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15890 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
158a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
158b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
158c0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
158d0 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
158e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
158f0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
15900 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
15910 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
15920 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
15930 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
15940 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
15950 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
15960 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
15970 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
15980 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
15990 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
159a0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
159b0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
159c0 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
159d0 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
159e0 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
159f0 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
15a00 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
15a10 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
15a20 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
15a30 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
15a40 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
15a50 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
15a60 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
15a70 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
15a80 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
15a90 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
15aa0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
15ab0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15ac0 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
15ad0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ae0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15af0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15b00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15b10 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
15b20 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
15b30 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
15b40 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15b50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15b60 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
15b70 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
15b80 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15b90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15ba0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
15bb0 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15bc0 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15bd0 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15be0 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15bf0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15c00 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15c10 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
15c20 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
15c30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15c40 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15c50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15c60 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15c70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15c80 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15c90 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
15ca0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
15cb0 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15cc0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15ce0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15cf0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15d00 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15d10 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
15d20 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
15d30 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
15d40 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
15d50 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
15d60 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
15d70 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15d80 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15d90 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15da0 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15db0 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15dc0 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15dd0 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15de0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15df0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15e00 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15e10 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
15e20 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
15e30 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
15e40 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
15e50 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15e60 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
15e70 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15e80 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15e90 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15ea0 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15eb0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15ec0 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15ed0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ee0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15ef0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15f00 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15f10 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15f20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15f30 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
15f40 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
15f50 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
15f60 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
15f70 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
15f80 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
15f90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15fa0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15fb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15fc0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15fd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15fe0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15ff0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
16000 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
16010 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
16020 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16040 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16050 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
16060 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
16070 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
16080 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
16090 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
160a0 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
160b0 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
160c0 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
160d0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
160e0 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
160f0 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
16100 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
16110 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
16120 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
16130 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
16140 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
16150 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
16160 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
16170 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
16180 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
16190 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
161a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
161b0 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
161c0 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
161d0 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
161e0 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
161f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16200 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
16210 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
16220 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
16230 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
16240 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
16250 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
16260 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
16270 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
16280 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
16290 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
162a0 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
162b0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
162c0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
162d0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
162e0 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
162f0 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
16300 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
16310 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
16320 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  he BTS_PAGESIZE_
16330 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65  FIXED flag is se
16340 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
16350 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
16360 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
16370 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
16380 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
16390 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
163a0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
163b0 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
163c0 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
163d0 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
163e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
163f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16400 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16410 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
16420 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
16430 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16440 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20  eeEnter(p);.#if 
16450 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16460 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e  .  if( nReserve>
16470 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16480 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d  rve ) pBt->optim
16490 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29  alReserve = (u8)
164a0 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  nReserve;.#endif
164b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
164c0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
164d0 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20  IZE_FIXED ){.   
164e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
164f0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
16500 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
16510 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
16520 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
16530 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
16540 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
16550 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
16560 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
16570 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
16580 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
16590 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
165a0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
165b0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
165c0 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
165d0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
165e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
165f0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
16600 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
16610 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
16620 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
16630 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
16640 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
16650 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
16660 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
16670 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
16680 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
16690 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
166a0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
166b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
166c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
166d0 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
166e0 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
166f0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16700 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
16710 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16720 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16730 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
16740 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
16750 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
16760 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
16770 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16780 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
16790 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
167a0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
167b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
167c0 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
167d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
167e0 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74  eserve(), except
167f0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20   that it.** may 
16800 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69  only be called i
16810 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  f it is guarante
16820 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72  ed that the b-tr
16830 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65  ee mutex is alre
16840 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a  ady.** held..**.
16850 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75  ** This is usefu
16860 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c  l in one special
16870 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63   case in the bac
16880 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65  kup API code whe
16890 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77  re it is.** know
168a0 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65  n that the share
168b0 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
168c0 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20  s held, but the 
168d0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a  mutex on the .**
168e0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
168f0 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73   that owns *p is
16900 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61   not. In this ca
16910 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72  se if sqlite3Btr
16920 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72  eeEnter().** wer
16930 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20  e to be called, 
16940 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65  it might collide
16950 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72   with some other
16960 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
16970 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
16980 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
16990 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66  p, causing undef
169a0 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a  ined behavior..*
169b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
169c0 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
169d0 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tex(Btree *p){. 
169e0 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
169f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16a00 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
16a10 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  ex) );.  n = p->
16a20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
16a30 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
16a40 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ze;.  return n;.
16a50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16a60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
16a70 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
16a80 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
16a90 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
16aa0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
16ab0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
16ac0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
16ad0 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
16ae0 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
16af0 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
16b00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
16b10 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64  E_HAS_MUTEX is d
16b20 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20  efined then the 
16b30 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
16b40 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65  is the.** greate
16b50 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  r of the current
16b60 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
16b70 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
16b80 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73  requested.** res
16b90 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69  erve space..*/.i
16ba0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
16bb0 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  etOptimalReserve
16bc0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16bd0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16be0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16bf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
16c00 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
16c10 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
16c20 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
16c30 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74  f( n<p->pBt->opt
16c40 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20  imalReserve ) n 
16c50 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  = p->pBt->optima
16c60 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  lReserve;.#endif
16c70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16c80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16c90 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
16ca0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
16cb0 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
16cc0 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
16cd0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
16ce0 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
16cf0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
16d00 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
16d10 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
16d20 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
16d30 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
16d40 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
16d50 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
16d60 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
16d70 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
16d80 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
16d90 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
16da0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16db0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
16dc0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
16dd0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
16de0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
16df0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16e00 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
16e10 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
16e20 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
16e30 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
16e40 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
16e50 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
16e60 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
16e70 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
16e80 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
16e90 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
16ea0 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
16eb0 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
16ec0 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
16ed0 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
16ee0 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
16ef0 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
16f00 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
16f10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
16f20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16f30 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
16f40 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
16f50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
16f60 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
16f70 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
16f80 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
16f90 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
16fa0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
16fb0 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
16fc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
16fd0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
16fe0 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
16ff0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17000 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
17010 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
17020 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
17030 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
17040 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
17050 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
17060 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
17070 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
17080 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
17090 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
170a0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
170b0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
170c0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
170d0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
170e0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
170f0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
17100 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
17110 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
17120 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
17130 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
17140 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
17150 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
17160 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17170 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
17180 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
17190 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
171a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
171b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
171c0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
171d0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
171e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
171f0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
17200 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
17210 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
17220 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
17230 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
17240 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
17250 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
17270 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
17280 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
17290 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
172a0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
172b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
172c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
172d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
172e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
172f0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
17300 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
17310 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
17320 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
17330 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
17340 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
17350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17360 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
17370 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
17380 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17390 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
173a0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
173b0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
173c0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
173d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
173e0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
173f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
17400 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
17410 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
17420 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
17430 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
17440 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
17450 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
17460 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
17470 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
17490 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
174a0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
174b0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
174c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
174d0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
174e0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
174f0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
17500 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
17510 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
17520 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
17530 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
17540 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
17550 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
17560 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
17570 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
17580 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
17590 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
175a0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
175b0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
175c0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
175d0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
175e0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
175f0 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
17600 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
17610 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
17620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17630 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
17640 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
17650 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
17660 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
17670 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17680 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
17690 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
176a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
176b0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
176c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
176d0 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
176e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
176f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17700 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
17710 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
17720 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
17730 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
17740 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
17750 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
17760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17770 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
17790 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
177a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
177b0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
177c0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
177d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
177e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
177f0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
17800 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
17810 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
17820 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17830 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
17840 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
17850 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
17860 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
17870 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
17880 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
17890 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
178a0 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
178b0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
178c0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
178d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
178e0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
178f0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
17900 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
17910 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
17920 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
17930 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
17940 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
17950 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
17960 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
17970 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
17980 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
17990 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
179a0 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
179b0 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
179c0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
179d0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
179e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
179f0 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45   R-43737-39999 E
17a00 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74  very valid SQLit
17a10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17a20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69  begins.    ** wi
17a30 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
17a40 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65   16 bytes (in he
17a50 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20  x): 53 51 4c 69 
17a60 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37  74 65 20 66 6f 7
17a70 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37  2 6d.    ** 61 7
17a80 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20  4 20 33 00. */. 
17a90 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
17aa0 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
17ab0 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
17ac0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
17ad0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
17ae0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17af0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
17b00 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
17b10 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
17b20 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
17b30 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
17b40 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
17b50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
17b60 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17b70 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
17b80 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
17b90 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
17ba0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
17bb0 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
17bc0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
17bd0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
17be0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
17bf0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
17c00 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
17c10 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
17c20 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
17c30 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
17c40 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
17c50 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
17c60 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
17c70 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
17c80 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
17c90 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
17ca0 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
17cb0 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
17cc0 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
17cd0 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
17ce0 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
17cf0 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
17d00 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
17d10 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
17d20 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
17d30 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
17d40 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
17d50 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
17d60 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
17d70 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
17d80 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
17d90 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
17da0 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
17db0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
17dc0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
17dd0 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
17de0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
17df0 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
17e00 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
17e10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17e20 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
17e30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
17e40 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
17e50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17e60 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
17e70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17e80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
17e90 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
17ea0 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
17eb0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
17ec0 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 20 20  L_SYNCHRONOUS.  
17ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
17ee0 62 3b 0a 20 20 20 20 20 20 20 20 44 62 20 2a 70  b;.        Db *p
17ef0 44 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Db;.        if( 
17f00 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20  (db=pBt->db)!=0 
17f10 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29  && (pDb=db->aDb)
17f20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
17f30 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
17f40 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
17f50 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
17f60 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  ++; }.          
17f70 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65  if( pDb->bSyncSe
17f80 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  t==0.           
17f90 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
17fa0 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f 44 45 46  evel==SQLITE_DEF
17fb0 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
17fc0 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  +1.          ){.
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
17fe0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
17ff0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18000 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  AL_SYNCHRONOUS+1
18010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
18020 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
18030 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a  gs(pBt->pPager,.
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18050 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18060 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
18070 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
18080 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
18090 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
180a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
180b0 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
180c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
180d0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
180e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
180f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
18100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
18110 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
18120 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18130 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18140 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
18150 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
18160 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
18170 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
18180 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
18190 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
181a0 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
181b0 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
181c0 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
181d0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
181e0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
181f0 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
18200 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
18210 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
18220 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
18230 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
18240 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
18250 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
18260 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
18270 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
18280 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18290 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
182a0 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
182b0 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
182c0 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
182d0 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
182e0 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
182f0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
18300 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
18310 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
18320 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
18330 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
18340 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18360 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
18370 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
18380 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
18390 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
183a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
183b0 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
183c0 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
183d0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
183e0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
183f0 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
18400 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
18410 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
18420 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
18430 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
18440 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
18450 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
18460 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
18470 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18480 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18490 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
184a0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
184b0 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
184c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
184d0 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
184e0 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
184f0 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
18500 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
18510 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
18520 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18530 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
18540 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
18550 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
18560 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
18570 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
18580 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
18590 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
185a0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
185b0 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
185c0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
185d0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
185e0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
185f0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
18600 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
18610 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
18620 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
18630 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
18640 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
18650 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
18660 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
18670 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
18680 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
18690 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
186a0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
186b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
186c0 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
186d0 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
186e0 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
186f0 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
18700 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
18710 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
18720 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
18730 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
18740 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
18750 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
18760 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
18770 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
18780 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
18790 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
187a0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
187b0 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
187c0 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
187d0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
187e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
187f0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
18800 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
18810 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
18820 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
18830 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
18840 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
18850 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
18860 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
18870 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
18880 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
18890 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
188c0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
188d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
188e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
188f0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
18900 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
18910 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
18920 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
18930 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
18940 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
18950 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18960 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18970 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18980 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
18990 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
189a0 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
189b0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
189c0 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
189d0 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
189e0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
189f0 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
18a00 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
18a10 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
18a20 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
18a30 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
18a40 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
18a50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18a60 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
18a70 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
18a80 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
18a90 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
18aa0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
18ab0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
18ac0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18ad0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
18ae0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
18af0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
18b00 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
18b10 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
18b20 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
18b30 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
18b40 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
18b50 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
18b60 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
18b70 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
18b80 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
18b90 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
18ba0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
18bb0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
18bc0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
18bd0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
18be0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
18bf0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
18c00 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
18c10 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
18c20 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
18c30 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
18c40 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
18c50 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
18c60 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
18c70 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
18c80 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
18c90 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
18ca0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
18cb0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
18cc0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
18cd0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
18ce0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
18cf0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
18d00 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
18d10 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
18d20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
18d30 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
18d40 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
18d50 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
18d60 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
18d70 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
18d80 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
18d90 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
18da0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
18db0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
18dc0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
18dd0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
18de0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
18df0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
18e00 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
18e10 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
18e20 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
18e30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
18e40 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
18e50 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
18e60 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
18e70 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
18e80 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
18e90 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
18ea0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
18eb0 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
18ec0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
18ed0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
18ee0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
18ef0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
18f00 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
18f10 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
18f20 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
18f30 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
18f40 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
18f50 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
18f60 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
18f70 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
18f80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
18f90 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
18fa0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
18fb0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
18fc0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
18fd0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18fe0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
18ff0 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
19000 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
19010 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
19020 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
19030 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19040 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19050 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19060 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19070 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19080 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19090 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
190a0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
190b0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
190c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
190d0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
190e0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
190f0 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
19100 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
19110 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
19120 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
19130 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
19140 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
19150 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
19160 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
19170 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
19180 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
19190 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
191a0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
191b0 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
191c0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
191d0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
191e0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
191f0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
19200 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
19210 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
19220 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
19230 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
19240 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
19250 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
19260 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
19270 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
19280 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
19290 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
192a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
192b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
192c0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
192d0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
192e0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
192f0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
19300 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
19310 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
19320 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
19330 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
19340 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
19350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19360 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
19370 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
19380 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
19390 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
193a0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
193b0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
193c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
193d0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
193e0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
193f0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
19400 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19410 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19420 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
19430 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
19440 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
19450 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
19460 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
19470 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
19480 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
19490 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
194a0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
194b0 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
194c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
194d0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
194e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
194f0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
19500 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19510 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
19520 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
19530 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
19540 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
19550 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
19560 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
19570 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
19580 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
19590 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
195a0 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
195b0 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
195c0 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
195d0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
195e0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
195f0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
19600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
19610 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
19620 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
19630 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
19640 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
19650 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
19660 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19670 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
19680 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
19690 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
196a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
196b0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
196c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
196d0 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
196e0 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
196f0 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
19700 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
19710 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
19720 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19730 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
19740 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
19750 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
19760 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
19770 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
19780 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
19790 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
197a0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
197b0 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
197c0 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
197d0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
197e0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
197f0 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
19800 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
19810 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
19820 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
19830 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
19840 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
19850 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
19860 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
19870 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
19880 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
19890 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
198a0 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
198b0 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
198c0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
198d0 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
198e0 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
198f0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
19900 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
19910 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
19920 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
19930 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
19940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19950 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
19960 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
19970 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
19980 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
19990 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
199a0 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
199b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
199c0 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
199d0 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
199e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
199f0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
19a00 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
19a10 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
19a20 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
19a30 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
19a40 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
19a50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19a60 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
19a70 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
19a80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19a90 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
19aa0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
19ab0 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
19ac0 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
19ad0 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
19ae0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
19af0 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
19b00 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
19b10 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
19b20 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
19b30 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
19b40 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19b50 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
19b60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19b70 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
19b80 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
19b90 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
19ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19bb0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
19bc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
19bd0 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
19be0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
19bf0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
19c00 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
19c10 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
19c20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
19c30 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
19c40 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
19c50 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
19c60 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19c70 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
19c80 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
19c90 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
19ca0 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
19cb0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
19cc0 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
19cd0 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
19ce0 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
19cf0 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
19d00 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
19d10 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
19d20 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
19d30 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
19d40 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
19d50 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
19d60 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
19d70 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
19d80 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
19d90 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
19da0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
19db0 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
19dc0 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
19dd0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
19de0 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
19df0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
19e00 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
19e10 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
19e20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
19e30 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
19e40 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19e50 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
19e60 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19e70 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
19e80 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
19e90 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
19ea0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19eb0 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
19ec0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19ed0 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
19ee0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19ef0 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
19f00 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
19f10 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
19f20 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
19f30 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
19f40 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
19f50 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
19f60 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
19f70 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
19f80 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
19f90 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
19fa0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
19fb0 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
19fc0 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
19fd0 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
19fe0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
19ff0 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1a000 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1a010 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1a020 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1a030 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1a040 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1a050 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1a060 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1a070 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1a080 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1a090 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1a0a0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1a0b0 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1a0c0 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1a0d0 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1a0e0 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1a0f0 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1a100 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1a110 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1a120 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1a130 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1a140 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1a150 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1a160 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1a170 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1a180 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1a190 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1a1a0 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1a1b0 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1a1c0 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1a1d0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1a1e0 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1a1f0 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1a200 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1a210 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1a220 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1a230 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1a240 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1a250 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1a260 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1a270 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1a280 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1a290 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a2a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1a2b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a2c0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1a2d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1a2e0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1a2f0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1a300 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1a310 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1a320 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1a330 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1a340 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1a350 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1a360 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1a370 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1a380 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1a390 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a3a0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1a3b0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1a3c0 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1a3d0 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1a3e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1a3f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1a400 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a410 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1a420 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1a430 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1a440 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1a450 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1a460 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1a470 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1a480 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1a490 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1a4a0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1a4b0 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1a4c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1a4d0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1a4e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1a4f0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1a500 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1a510 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1a520 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1a530 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1a540 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1a550 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1a560 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1a570 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1a580 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1a590 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1a5a0 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1a5b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1a5c0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1a5d0 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1a5e0 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1a5f0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1a600 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1a610 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a620 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1a630 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1a640 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1a650 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1a660 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1a670 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1a680 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1a690 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1a6a0 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1a6b0 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1a6c0 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1a6d0 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1a6e0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1a6f0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1a700 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1a710 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1a720 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1a730 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1a740 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a750 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1a760 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1a770 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1a780 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1a790 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a7a0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1a7b0 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1a7c0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1a7d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1a7e0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1a7f0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1a800 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1a810 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1a820 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1a830 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1a840 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1a850 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1a860 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1a870 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1a880 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1a890 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1a8a0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1a8b0 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1a8c0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1a8d0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1a8e0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1a8f0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1a900 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1a910 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1a920 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1a930 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1a940 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1a950 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1a960 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1a970 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1a980 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1a990 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1a9a0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1a9b0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1a9c0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1a9d0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1a9e0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1a9f0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1aa00 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1aa10 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1aa20 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1aa30 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1aa40 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1aa50 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1aa60 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1aa70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1aa80 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1aa90 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1aaa0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1aab0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1aac0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1aad0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1aae0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1aaf0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1ab00 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1ab10 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1ab20 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1ab30 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1ab40 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1ab50 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1ab60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1ab70 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1ab80 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1ab90 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1aba0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1abb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1abc0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1abd0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1abe0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1abf0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1ac00 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1ac10 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1ac20 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1ac30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ac40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ac50 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1ac60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ac70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1ac80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ac90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1aca0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1acb0 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1acc0 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1acd0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1ace0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1acf0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1ad00 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1ad10 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1ad20 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1ad30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ad40 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1ad50 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1ad60 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1ad70 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1ad80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ad90 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1ada0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1adb0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1adc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1add0 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1ade0 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1adf0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1ae00 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1ae10 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1ae20 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1ae30 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1ae40 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1ae50 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1ae60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1ae70 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1ae80 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1ae90 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1aea0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1aeb0 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1aec0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1aed0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1aee0 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1aef0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1af00 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1af10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1af20 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1af30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1af40 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1af50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1af60 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1af70 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1af80 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1af90 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1afa0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1afb0 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1afc0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1afd0 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1afe0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1aff0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1b000 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1b010 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1b020 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1b030 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1b040 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1b050 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1b060 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1b070 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1b080 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1b090 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1b0a0 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1b0b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1b0c0 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1b0d0 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1b0e0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1b0f0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1b100 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1b110 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1b120 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1b130 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1b140 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1b150 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1b160 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1b170 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1b180 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1b190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1b1a0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1b1b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1b1c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1b1e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1b1f0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1b200 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1b210 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b220 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1b230 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1b240 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1b250 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1b260 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1b270 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1b280 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1b290 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1b2a0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1b2b0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1b2c0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1b2d0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1b2e0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1b2f0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1b300 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1b310 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1b320 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1b330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b340 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1b350 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1b360 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1b370 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1b380 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1b390 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b3a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1b3b0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1b3c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1b3d0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1b3e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1b3f0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1b400 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1b410 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1b420 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1b430 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1b440 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1b450 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1b460 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1b470 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1b480 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1b490 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1b4a0 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1b4b0 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1b4c0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1b4f0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1b500 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b530 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1b540 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1b550 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b570 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1b580 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b590 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1b5a0 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
1b5b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
1b5c0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1b5d0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1b5e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b5f0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1b600 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1b610 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
1b620 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1b630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b640 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
1b650 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
1b660 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
1b670 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1b680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1b690 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1b6a0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1b6b0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1b6c0 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1b6d0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1b6e0 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1b6f0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1b700 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1b710 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1b720 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1b730 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1b740 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1b750 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1b760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1b770 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1b780 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1b790 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1b7a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1b7b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1b7c0 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1b7d0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1b7e0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1b7f0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1b800 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
1b810 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
1b820 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
1b830 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
1b840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1b850 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1b860 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1b870 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1b880 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1b890 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1b8a0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1b8b0 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1b8c0 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1b8d0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1b8e0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1b8f0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1b900 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1b910 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1b920 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1b930 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1b940 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b960 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1b970 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1b980 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1b990 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1b9a0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1b9b0 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1b9c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b9d0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1b9e0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1b9f0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1ba00 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1ba10 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1ba20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1ba30 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1ba40 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1ba50 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1ba60 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1ba70 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1ba80 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1ba90 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1baa0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1bab0 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1bac0 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1bad0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1bae0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1baf0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1bb00 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1bb10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1bb20 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1bb30 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1bb40 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1bb50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1bb60 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1bb70 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1bb80 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1bb90 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1bba0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1bbb0 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1bbc0 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1bbd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1bbe0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1bbf0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1bc00 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1bc10 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1bc20 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
1bc30 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
1bc40 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
1bc50 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
1bc60 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  l;.    int rc;..
1bc70 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
1bc80 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1bc90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1bca0 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1bcb0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1bcc0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1bcd0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1bce0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1bcf0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1bd00 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1bd10 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1bd20 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1bd30 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1bd40 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1bd50 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1bd60 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1bd70 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1bd80 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
1bd90 79 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 26  yload.         &
1bda0 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  & pCell+info.nSi
1bdb0 7a 65 2d 31 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ze-1<=pPage->aDa
1bdc0 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
1bdd0 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
1bde0 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70  From==get4byte(p
1bdf0 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
1be00 34 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  4).        ){.  
1be10 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1be20 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1be30 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  e-4, iTo);.     
1be40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1be60 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
1be70 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
1be80 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1be90 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1bea0 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
1beb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bed0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
1bee0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1bef0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1bf00 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
1bf10 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
1bf20 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1bf30 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1bf40 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1bf50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bf60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1bf70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
1bf80 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1bf90 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1bfa0 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
1bfb0 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
1bfc0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
1bfd0 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
1bfe0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1bff0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1c000 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
1c010 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
1c020 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
1c030 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
1c040 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
1c050 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
1c060 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  ains valid..**.*
1c070 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  * The isCommit f
1c080 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
1c090 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  at there is no n
1c0a0 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1c0b0 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  that.** the jour
1c0c0 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
1c0d0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
1c0e0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1c0f0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20  bPage->pgno .** 
1c100 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
1c110 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
1c120 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
1c130 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
1c140 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e  to that.** page.
1c150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1c160 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
1c170 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1c180 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1c190 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1c1a0 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
1c1b0 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
1c1c0 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
1c1d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c1e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1c1f0 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
1c200 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1c210 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
1c220 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1c230 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
1c240 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1c250 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
1c260 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
1c270 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
1c280 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
1c290 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
1c2a0 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1c2b0 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c    /* isCommit fl
1c2c0 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ag passed to sql
1c2d0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1c2e0 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
1c2f0 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
1c300 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1c310 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1c320 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
1c330 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
1c340 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
1c350 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1c360 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1c370 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1c380 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
1c390 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
1c3a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1c3b0 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
1c3c0 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
1c3d0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1c3e0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1c3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1c400 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c410 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1c420 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
1c430 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
1c440 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
1c450 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
1c460 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
1c470 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
1c480 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
1c490 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
1c4a0 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
1c4b0 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
1c4c0 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
1c4d0 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
1c4e0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1c4f0 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
1c500 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1c510 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
1c520 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
1c530 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
1c540 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
1c550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c560 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1c570 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
1c580 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
1c590 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
1c5a0 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
1c5b0 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
1c5c0 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
1c5d0 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
1c5e0 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
1c5f0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1c600 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
1c610 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
1c620 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
1c630 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
1c640 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
1c650 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
1c660 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
1c670 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
1c680 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
1c690 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
1c6a0 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
1c6b0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1c6c0 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
1c6d0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
1c6e0 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
1c6f0 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
1c700 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
1c710 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1c720 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
1c730 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1c740 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1c750 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1c760 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
1c770 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
1c780 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1c790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c7a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1c7b0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1c7c0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
1c7d0 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
1c7e0 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
1c7f0 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
1c800 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
1c810 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
1c820 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
1c830 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
1c840 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
1c850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1c870 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1c880 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1c890 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
1c8a0 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
1c8b0 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
1c8c0 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
1c8d0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
1c8e0 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
1c8f0 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
1c900 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1c910 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
1c920 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
1c930 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1c940 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1c950 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1c960 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
1c970 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
1c980 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c9a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c9b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c9c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
1c9d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1c9e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c9f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ca00 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1ca10 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
1ca20 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1ca30 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
1ca40 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
1ca50 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
1ca60 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
1ca70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ca80 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1ca90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1caa0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1cab0 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
1cac0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1cad0 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
1cae0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1caf0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1cb00 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
1cb10 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
1cb20 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
1cb30 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1cb40 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
1cb50 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
1cb60 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
1cb70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
1cb80 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
1cb90 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
1cba0 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
1cbb0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
1cbc0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
1cbd0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
1cbe0 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
1cbf0 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
1cc00 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
1cc10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
1cc20 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
1cc30 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
1cc40 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
1cc50 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
1cc60 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
1cc70 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
1cc80 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
1cc90 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1cca0 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
1ccb0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1ccc0 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
1ccd0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
1cce0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
1ccf0 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
1cd00 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
1cd10 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
1cd20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1cd30 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
1cd40 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
1cd50 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
1cd60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1cd70 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
1cd80 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1cd90 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1cda0 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
1cdb0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
1cdc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
1cdd0 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
1cde0 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
1cdf0 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
1ce00 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
1ce10 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1ce20 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
1ce30 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
1ce40 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
1ce50 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1ce60 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
1ce70 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
1ce80 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
1ce90 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1cea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1ceb0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
1cec0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1ced0 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
1cee0 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
1cef0 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
1cf00 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1cf10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1cf20 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
1cf30 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
1cf40 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1cf50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1cf60 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1cf70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
1cf80 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
1cf90 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
1cfa0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1cfb0 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
1cfc0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1cfd0 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
1cfe0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
1cff0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
1d000 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
1d010 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1d020 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1d030 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
1d040 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1d050 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
1d060 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
1d070 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
1d080 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
1d090 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
1d0a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d0b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d0c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1d0d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d0e0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1d0f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d100 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d110 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
1d120 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1d130 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
1d140 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1d150 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
1d160 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
1d170 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
1d180 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
1d190 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
1d1a0 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
1d1b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
1d1c0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
1d1d0 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
1d1e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
1d1f0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
1d200 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1d210 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
1d220 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
1d230 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
1d240 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
1d250 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
1d260 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
1d270 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1d280 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1d290 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1d2a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1d2b0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d2c0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1d2d0 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
1d2e0 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
1d2f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d310 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d320 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1d330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1d340 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
1d350 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
1d360 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1d370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
1d380 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
1d390 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
1d3a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1d3b0 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
1d3c0 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
1d3d0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
1d3e0 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
1d3f0 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
1d400 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
1d410 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
1d420 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1d430 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
1d440 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
1d450 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
1d460 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1d470 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d480 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
1d490 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1d4a0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
1d4b0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
1d4c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d4d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1d4e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1d4f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
1d500 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
1d510 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
1d520 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
1d530 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
1d540 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
1d550 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
1d560 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
1d570 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
1d580 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
1d590 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
1d5a0 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
1d5b0 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
1d5c0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
1d5d0 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
1d5e0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
1d5f0 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
1d600 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
1d610 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
1d620 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
1d630 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
1d640 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
1d650 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1d660 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
1d670 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
1d680 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
1d690 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
1d6a0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1d6b0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1d6c0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1d6d0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1d6e0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1d6f0 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
1d700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d720 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1d730 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1d740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d750 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d760 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d770 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1d780 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
1d790 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
1d7a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d7b0 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
1d7c0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
1d7d0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
1d7e0 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
1d7f0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1d800 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
1d810 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
1d820 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1d830 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d840 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d850 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d870 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
1d880 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
1d890 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
1d8a0 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
1d8b0 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
1d8c0 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
1d8d0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1d8e0 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
1d8f0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1d900 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
1d910 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
1d920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1d930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d940 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
1d950 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
1d960 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1d970 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1d980 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
1d990 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
1d9a0 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
1d9b0 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
1d9c0 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
1d9d0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
1d9e0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
1d9f0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
1da00 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
1da10 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1da20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
1da30 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1da40 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
1da50 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
1da60 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
1da70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1da80 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1da90 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
1daa0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
1dab0 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
1dac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dad0 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
1dae0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
1daf0 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1db20 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
1db30 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1db40 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
1db50 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
1db60 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
1db70 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
1db80 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
1db90 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
1dba0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
1dbb0 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
1dbc0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
1dbd0 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
1dbe0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1dbf0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
1dc00 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
1dc10 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
1dc20 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
1dc30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1dc40 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1dc50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
1dc60 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
1dc70 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1dc80 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
1dc90 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
1dca0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1dcb0 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
1dcc0 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
1dcd0 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
1dce0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1dcf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1dd00 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1dd10 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
1dd20 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1dd30 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
1dd40 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
1dd50 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
1dd60 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
1dd70 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1dd80 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
1dd90 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
1dda0 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
1ddb0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
1ddc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ddd0 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
1dde0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1ddf0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1de00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1de10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1de20 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
1de30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1de40 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1de50 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1de60 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1de70 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
1de80 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
1de90 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1dea0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1deb0 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1dec0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1ded0 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
1dee0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1def0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1df00 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
1df10 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1df20 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1df30 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
1df40 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
1df50 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1df60 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
1df70 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
1df80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1df90 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1dfa0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1dfb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dfc0 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
1dfd0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1dfe0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
1dff0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1e000 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1e010 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
1e020 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e040 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e050 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e060 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1e070 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
1e080 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e090 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1e0a0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1e0b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1e0c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e0d0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
1e0e0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1e0f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1e100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e110 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e120 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
1e130 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1e140 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
1e150 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
1e160 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
1e170 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e180 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
1e190 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e1a0 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
1e1b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1e1c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
1e1d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1e1e0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
1e1f0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
1e200 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
1e210 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
1e220 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1e230 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
1e240 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
1e250 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
1e260 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
1e270 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
1e280 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
1e290 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
1e2a0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
1e2b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1e2c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1e2d0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
1e2e0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
1e2f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1e300 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29  count(pPager); )
1e310 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1e320 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1e330 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1e340 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1e350 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1e360 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
1e370 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
1e380 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
1e390 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
1e3a0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
1e3b0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e3c0 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
1e3d0 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
1e3e0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
1e3f0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
1e400 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1e410 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
1e420 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
1e430 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
1e440 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
1e450 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
1e460 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
1e470 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e480 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
1e490 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
1e4a0 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1e4b0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1e4c0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
1e4d0 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
1e4e0 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
1e4f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e500 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
1e510 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
1e520 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
1e530 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
1e540 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
1e550 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
1e560 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1e570 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
1e580 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
1e590 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
1e5a0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
1e5b0 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
1e5c0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
1e5d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e5e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e5f0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
1e600 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1e610 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e620 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
1e630 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1e640 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1e650 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
1e660 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
1e670 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e680 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
1e690 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
1e6a0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1e6b0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1e6c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1e6d0 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
1e6e0 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
1e6f0 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
1e700 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
1e710 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1e720 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
1e730 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1e740 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1e750 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
1e760 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
1e770 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1e780 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e790 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1e7a0 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
1e7b0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e7c0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
1e7d0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e7e0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e7f0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
1e800 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1e810 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e820 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
1e830 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1e840 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
1e850 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
1e860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1e890 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
1e8a0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1e8b0 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
1e8c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1e8d0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1e8e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e8f0 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
1e900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1e910 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
1e920 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
1e930 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
1e940 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1e950 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1e960 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1e970 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
1e980 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
1e990 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
1e9a0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1e9b0 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
1e9c0 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
1e9d0 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
1e9e0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
1e9f0 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
1ea00 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
1ea10 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
1ea20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
1ea30 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
1ea40 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
1ea50 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
1ea60 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
1ea70 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
1ea80 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
1ea90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1eaa0 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
1eab0 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
1eac0 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
1ead0 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
1eae0 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
1eaf0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
1eb00 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
1eb10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1eb20 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
1eb30 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
1eb40 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
1eb50 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
1eb60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
1eb70 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
1eb80 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
1eb90 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
1eba0 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
1ebb0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1ebc0 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
1ebd0 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
1ebe0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1ebf0 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
1ec00 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1ec10 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
1ec20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1ec30 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
1ec40 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
1ec50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1ec60 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1ec70 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
1ec80 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
1ec90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1eca0 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
1ecb0 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
1ecc0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
1ecd0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1ece0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1ecf0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1ed00 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
1ed10 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
1ed20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
1ed30 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
1ed40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ed50 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
1ed60 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1ed70 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
1ed80 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
1ed90 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
1eda0 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
1edb0 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
1edc0 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
1edd0 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
1ede0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
1edf0 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
1ee00 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
1ee10 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
1ee20 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
1ee30 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
1ee40 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
1ee50 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
1ee60 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
1ee70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1ee80 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1ee90 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
1eea0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1eeb0 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
1eec0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1eed0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
1eee0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1eef0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1ef00 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1ef10 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1ef20 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1ef30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1ef40 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
1ef50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ef60 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1ef70 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1ef80 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
1ef90 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
1efa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1efb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1efc0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1efd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1efe0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1eff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f000 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  if( pBt->bDoTrun
1f010 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  cate ){.      sq
1f020 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1f030 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
1f040 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ger, pBt->nPage)
1f050 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f070 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1f080 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
1f090 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
1f0a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1f0b0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1f0c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f0d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f0e0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
1f0f0 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
1f100 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
1f110 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
1f120 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1f130 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
1f140 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1f150 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
1f160 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
1f170 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1f180 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1f190 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1f1a0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
1f1b0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1f1c0 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
1f1d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f1e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
1f1f0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
1f200 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1f210 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1f220 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62  NONE && db->nVdb
1f230 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f  eRead>1 ){.    /
1f240 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
1f250 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74  ther active stat
1f260 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f  ements that belo
1f270 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ng to this datab
1f280 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c  ase.    ** handl
1f290 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  e, downgrade to 
1f2a0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1f2b0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68  saction. The oth
1f2c0 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  er statements.  
1f2d0 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62    ** may still b
1f2e0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
1f2f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
1f300 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
1f310 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1f320 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
1f330 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1f340 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
1f350 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
1f360 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
1f370 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
1f380 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
1f390 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
1f3a0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1f3b0 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
1f3c0 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
1f3d0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
1f3e0 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
1f3f0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1f400 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1f410 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
1f420 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
1f430 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
1f440 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
1f450 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
1f460 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
1f470 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1f480 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
1f490 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1f4a0 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
1f4b0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
1f4c0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
1f4d0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
1f4e0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1f4f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1f500 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1f510 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f520 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
1f530 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
1f540 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1f550 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
1f560 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
1f570 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
1f580 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
1f590 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
1f5a0 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
1f5b0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1f5c0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
1f5d0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1f5e0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1f5f0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1f600 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1f610 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f620 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
1f630 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
1f640 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
1f650 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
1f660 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
1f670 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
1f680 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1f690 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
1f6a0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1f6b0 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
1f6c0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
1f6d0 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
1f6e0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1f6f0 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
1f700 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1f710 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
1f720 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
1f730 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
1f740 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
1f750 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
1f760 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
1f770 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
1f780 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
1f790 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
1f7a0 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
1f7b0 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
1f7c0 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
1f7d0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
1f7e0 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
1f7f0 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
1f800 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
1f810 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
1f820 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
1f830 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
1f840 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
1f850 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1f860 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1f870 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
1f880 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
1f890 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
1f8a0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
1f8b0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
1f8c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1f8d0 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
1f8e0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
1f8f0 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
1f900 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
1f910 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
1f920 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
1f930 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
1f940 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
1f950 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
1f960 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
1f970 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1f980 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1f990 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1f9a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
1f9b0 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
1f9c0 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
1f9d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
1f9e0 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
1f9f0 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
1fa00 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
1fa10 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
1fa20 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
1fa30 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
1fa40 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
1fa50 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
1fa60 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
1fa70 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
1fa80 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
1fa90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
1faa0 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
1fab0 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
1fac0 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
1fad0 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
1fae0 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
1faf0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
1fb00 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1fb10 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1fb20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1fb30 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1fb40 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1fb50 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1fb60 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1fb70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1fb80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1fb90 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1fba0 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
1fbb0 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
1fbc0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1fbd0 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
1fbe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
1fbf0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1fc00 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1fc10 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1fc20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1fc30 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
1fc40 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
1fc50 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
1fc60 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
1fc70 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
1fc80 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1fc90 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
1fca0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1fcb0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1fcc0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
1fcd0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1fce0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1fcf0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1fd00 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1fd10 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
1fd20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
1fd30 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
1fd40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fd50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1fd60 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
1fd70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1fd80 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
1fd90 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
1fda0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1fdb0 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
1fdc0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1fdd0 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
1fde0 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
1fdf0 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
1fe00 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
1fe10 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1fe20 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1fe30 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1fe40 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1fe50 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1fe60 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1fe70 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1fe80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1fe90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fea0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
1feb0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
1fec0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
1fed0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
1fee0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1fef0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1ff00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1ff10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1ff20 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
1ff30 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1ff40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ff50 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ff60 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1ff70 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
1ff80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ff90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ffa0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1ffb0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
1ffc0 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
1ffd0 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
1ffe0 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
1fff0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
20000 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
20010 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
20020 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
20030 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
20040 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
20050 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
20060 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
20070 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
20080 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
20090 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
200a0 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
200b0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
200c0 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
200d0 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
200e0 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
200f0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
20100 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
20110 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
20120 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
20130 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
20140 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20150 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
20160 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
20170 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
20180 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
20190 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
201a0 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
201b0 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
201c0 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
201d0 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
201e0 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
201f0 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
20200 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
20210 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
20220 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
20230 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20240 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
20250 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
20260 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
20270 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
20280 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
20290 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
202a0 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
202b0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
202c0 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
202d0 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
202e0 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
202f0 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
20300 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20310 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
20320 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
20330 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
20340 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
20350 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
20360 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
20370 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
20380 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
20390 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
203a0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
203b0 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
203c0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
203d0 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
203e0 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
203f0 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
20400 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
20410 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20420 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
20430 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
20440 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
20450 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
20460 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
20470 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
20480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20490 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
204a0 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
204b0 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
204c0 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
204d0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
204e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
204f0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
20500 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
20510 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
20520 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
20530 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
20540 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
20550 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
20560 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
20570 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
20580 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
20590 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
205a0 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  ;.      if( writ
205b0 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
205c0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
205d0 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
205e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
205f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20600 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
20610 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
20620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20630 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
20640 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
20650 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20670 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
20680 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
20690 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
206a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
206b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
206c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
206d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
206e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
206f0 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
20700 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
20710 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
20720 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
20730 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
20740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
20750 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
20760 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
20770 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
20780 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
20790 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
207a0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
207b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
207c0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
207d0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
207e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
207f0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
20800 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
20810 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
20820 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
20830 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
20840 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
20850 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
20860 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
20870 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
20880 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
20890 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
208a0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
208b0 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
208c0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
208d0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
208e0 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
208f0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
20900 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
20910 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
20920 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
20930 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
20940 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
20950 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
20960 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
20970 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
20980 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
20990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
209a0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
209b0 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
209c0 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
209d0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
209e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
209f0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
20a00 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
20a10 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
20a20 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
20a30 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
20a40 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
20a50 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
20a60 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
20a70 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
20a80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20a90 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
20aa0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
20ab0 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
20ac0 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
20ad0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
20ae0 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
20af0 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
20b00 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
20b10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
20b20 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
20b30 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
20b40 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20b50 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
20b60 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
20b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
20b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
20b90 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
20ba0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
20bb0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
20bc0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
20bd0 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
20be0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
20bf0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
20c00 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
20c10 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
20c20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
20c30 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
20c40 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
20c50 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
20c60 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
20c70 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
20c80 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
20c90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
20ca0 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
20cb0 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
20cc0 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
20cd0 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
20ce0 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
20cf0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
20d00 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
20d10 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
20d20 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
20d30 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
20d40 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
20d50 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
20d60 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
20d70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
20d80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
20d90 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
20da0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
20db0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
20dc0 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
20dd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
20de0 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
20df0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
20e00 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
20e10 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
20e20 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
20e30 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
20e40 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
20e50 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
20e60 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
20e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20e80 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
20e90 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
20ea0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
20eb0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
20ec0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
20ed0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
20ee0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
20ef0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
20f00 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
20f10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20f30 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
20f40 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
20f50 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
20f60 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
20f70 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
20f80 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
20f90 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
20fa0 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
20fb0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
20fc0 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
20fd0 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
20fe0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
20ff0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
21000 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
21010 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
21020 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
21030 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
21040 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
21050 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
21060 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
21070 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
21080 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
21090 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
210a0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
210b0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
210c0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
210d0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
210e0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
210f0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
21100 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
21110 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
21120 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
21130 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
21140 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
21150 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
21160 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
21170 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
21180 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
21190 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
211a0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
211b0 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
211c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
211d0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
211e0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
211f0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
21200 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
21210 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
21220 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
21230 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
21240 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
21250 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
21260 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
21270 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
21280 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
21290 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
212a0 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
212b0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
212c0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
212d0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
212e0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
212f0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
21300 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
21310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21320 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
21330 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
21340 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
21350 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21360 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
21370 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
21390 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
213a0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
213b0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
213c0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
213d0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
213e0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
213f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
21400 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
21410 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
21420 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
21430 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21440 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
21450 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
21460 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
21470 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
21480 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
21490 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
214a0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
214b0 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
214c0 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
214d0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
214e0 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
214f0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
21500 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
21510 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
21520 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
21530 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
21540 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
21550 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
21560 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
21570 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
21580 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
21590 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
215a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
215b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
215c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
215d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
215e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
215f0 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
21600 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
21610 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
21620 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
21630 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
21640 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
21650 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
21660 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
21670 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
21680 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
21690 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
216a0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
216b0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
216c0 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
216d0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
216e0 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
216f0 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
21700 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
21710 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
21720 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
21730 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
21740 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
21750 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
21760 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
21770 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
21780 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
21790 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
217a0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
217b0 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
217c0 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
217d0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
217e0 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
217f0 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
21800 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
21810 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
21820 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
21830 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
21840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
21850 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
21860 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21870 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
21880 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21890 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
218a0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
218b0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
218c0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
218d0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
218e0 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
218f0 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
21900 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
21910 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
21920 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21930 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21940 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
21950 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
21960 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
21970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
21990 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
219a0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
219b0 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
219c0 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
219d0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
219e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
219f0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
21a00 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
21a10 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
21a20 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
21a30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
21a40 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
21a50 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
21a60 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
21a70 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
21a80 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
21a90 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
21aa0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
21ab0 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
21ac0 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
21ad0 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
21ae0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
21af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
21b00 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
21b10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
21b20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21b30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21b40 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
21b50 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
21b60 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
21b70 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
21b80 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
21b90 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
21ba0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
21bb0 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
21bc0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
21bd0 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
21be0 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
21bf0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
21c00 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
21c10 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
21c20 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
21c30 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21c40 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
21c50 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
21c60 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
21c70 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21c80 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
21c90 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
21ca0 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65  of wrFlag is cle
21cb0 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ar, then the cur
21cc0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20  sor can only.** 
21cd0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
21ce0 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52  ing.  If the BTR
21cf0 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20  EE_WRCSR bit is 
21d00 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  set, then the cu
21d10 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75  rsor.** can be u
21d20 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
21d30 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  or for writing i
21d40 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
21d50 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  ns for writing.*
21d60 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  * are also met. 
21d70 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
21d80 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
21d90 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
21da0 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69  der.** for writi
21db0 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64  ng to be allowed
21dc0 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
21dd0 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
21de0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
21df0 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e  h wrFlag contain
21e00 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a  ing BTREE_WRCSR.
21e10 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
21e20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21e30 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
21e40 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
21e50 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
21e60 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
21e70 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
21e80 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
21e90 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
21ea0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
21eb0 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
21ec0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
21ed0 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
21ee0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
21ef0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
21f00 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
21f10 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
21f20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
21f30 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
21f40 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21f50 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
21f60 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
21f70 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
21f80 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
21f90 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
21fa0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
21fb0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
21fc0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  ion..**.** The B
21fd0 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62  TREE_FORDELETE b
21fe0 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79  it of wrFlag may
21ff0 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73   optionally be s
22000 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53  et if BTREE_WRCS
22010 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66  R.** is set.  If
22020 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65   FORDELETE is se
22030 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e  t, that is a hin
22040 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
22050 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
22060 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c  this cursor will
22070 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f   only be used to
22080 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c   seek to and del
22090 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61  ete entries of a
220a0 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61  n index.** as pa
220b0 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44  rt of a larger D
220c0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  ELETE statement.
220d0 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20    The FORDELETE 
220e0 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  hint is not used
220f0 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c   by.** this impl
22100 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74  ementation.  But
22110 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63   in a hypothetic
22120 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  al alternative s
22130 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a  torage engine .*
22140 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78  * in which index
22150 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74   entries are aut
22160 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
22170 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f  ed when correspo
22180 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72  nding table.** r
22190 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ows are deleted,
221a0 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66   the FORDELETE f
221b0 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68  lag is a hint th
221c0 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20  at all SEEK and 
221d0 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74  DELETE.** operat
221e0 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72  ions on this cur
221f0 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70  sor can be no-op
22200 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f  s and all READ o
22210 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a  perations can .*
22220 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20  * return a null 
22230 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78  row (2-bytes: 0x
22240 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20  01 0x00)..**.** 
22250 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
22260 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
22270 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
22280 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
22290 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
222a0 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
222b0 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
222c0 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
222d0 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
222e0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
222f0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
22300 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
22310 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
22320 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
22330 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
22340 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
22350 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
22360 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
22370 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
22380 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
22390 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
223a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
223d0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
22400 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
22410 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
22420 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
22450 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
22460 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
22470 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
22480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22490 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
224a0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
224b0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
224c0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
224d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
224e0 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
224f0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
22500 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22510 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
22520 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
22530 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
22540 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
22570 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
22580 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
22590 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
225a0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
225b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
225c0 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20  Flag==0 .       
225d0 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45  || wrFlag==BTREE
225e0 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c  _WRCSR .       |
225f0 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45  | wrFlag==(BTREE
22600 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52  _WRCSR|BTREE_FOR
22610 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20  DELETE) .  );.. 
22620 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
22630 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
22640 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
22650 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
22660 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
22670 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
22680 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
22690 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
226a0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
226b0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
226c0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
226d0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
226e0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
226f0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
22700 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
22710 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
22720 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
22730 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
22740 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c  eyInfo!=0, (wrFl
22750 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73  ag?2:1)) );.  as
22760 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22770 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
22780 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
22790 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
227a0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
227b0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
227c0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
227d0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
227e0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
227f0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
22800 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22810 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
22820 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
22830 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
22840 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
22850 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
22860 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22870 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
22880 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
22890 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
228a0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
228b0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
228c0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
228d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
228e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
228f0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
22900 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
22910 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
22920 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
22930 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
22940 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
22950 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
22960 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
22970 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
22980 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
22990 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
229a0 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
229b0 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
229c0 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
229d0 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
229e0 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
229f0 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
22a00 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
22a10 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
22a20 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
22a30 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
22a40 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
22a50 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
22a60 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
22a70 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74  Flag ? BTCF_Writ
22a80 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75  eFlag : 0;.  pCu
22a90 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
22aa0 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20   = wrFlag ? 0 : 
22ab0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
22ac0 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  LY;.  /* If ther
22ad0 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
22ae0 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
22af0 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
22b00 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20  n all such.  ** 
22b10 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68  cursors *must* h
22b20 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  ave the BTCF_Mul
22b30 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
22b40 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d  */.  for(pX=pBt-
22b50 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58  >pCursor; pX; pX
22b60 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
22b70 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f   if( pX->pgnoRoo
22b80 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20  t==(Pgno)iTable 
22b90 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72  ){.      pX->cur
22ba0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
22bb0 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43  ltiple;.      pC
22bc0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
22bd0 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
22be0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
22bf0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
22c00 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43  ursor;.  pBt->pC
22c10 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
22c20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
22c30 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
22c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22c50 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
22c60 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
22c70 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22ca0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
22cb0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
22ce0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
22cf0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
22d00 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
22d30 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
22d40 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
22d50 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
22d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22d70 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
22d80 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
22d90 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
22da0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
22dd0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
22de0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
22df0 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72  Table<1 ){.    r
22e00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22e10 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
22e20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
22e30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
22e40 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
22e50 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
22e60 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
22e70 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
22e80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
22e90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22eb0 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
22ec0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
22ed0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
22ee0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
22ef0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
22f00 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
22f10 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
22f20 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
22f30 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
22f40 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
22f50 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
22f60 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
22f70 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
22f80 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
22f90 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
22fa0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
22fb0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
22fc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22fd0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
22fe0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
22ff0 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
23000 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
23010 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
23020 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
23030 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
23040 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
23050 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
23060 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
23070 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
23080 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
23090 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
230a0 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
230b0 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
230c0 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
230d0 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
230e0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
230f0 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
23100 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
23110 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
23120 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
23130 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
23140 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
23150 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
23160 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23170 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
23180 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
23190 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
231a0 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
231b0 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
231c0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
231d0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
231e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
231f0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
23200 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
23210 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
23220 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
23230 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
23240 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
23250 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
23260 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
23270 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
23280 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
23290 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
232a0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
232b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
232c0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
232d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
232e0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
232f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
23300 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
23310 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
23320 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
23330 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
23340 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
23350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23360 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
23370 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
23380 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
23390 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
233a0 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
233b0 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
233c0 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
233d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
233e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
233f0 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
23400 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
23410 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
23420 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
23430 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23440 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
23450 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
23460 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
23470 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
23480 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
23490 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
234a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
234b0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
234c0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
234d0 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
234e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
234f0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
23500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23510 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
23520 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
23530 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
23540 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
23550 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
23560 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
23570 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
23580 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
23590 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72  call.** btreePar
235a0 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
235b0 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
235c0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
235d0 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
235e0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
235f0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
23600 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
23610 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
23620 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
23630 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
23640 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ()..*/.#ifndef N
23650 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
23660 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
23670 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
23680 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
23690 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
236a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
236b0 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
236c0 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
236d0 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
236e0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
236f0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20  >apPage[iPage], 
23700 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
23710 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  e], &info);.    
23720 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
23730 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e  DB || memcmp(&in
23740 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
23750 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
23760 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
23770 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
23780 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
23790 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  f.static SQLITE_
237a0 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65  NOINLINE void ge
237b0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
237c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
237d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
237e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e==0 ){.    int 
237f0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
23800 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  age;.    pCur->c
23810 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
23820 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62  ValidNKey;.    b
23830 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
23840 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
23850 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
23860 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
23870 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23880 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
23890 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
238a0 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
238b0 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
238c0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
238d0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
238e0 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
238f0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
23900 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
23910 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
23920 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
23930 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
23940 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
23950 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
23960 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
23970 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
23980 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
23990 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
239a0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
239b0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
239c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
239d0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
239e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
239f0 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
23a00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23a10 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
23a20 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
23a30 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
23a40 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
23a50 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
23a60 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
23a70 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
23a80 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
23a90 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
23aa0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
23ab0 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
23ac0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
23ad0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
23ae0 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
23af0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
23b00 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
23b10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
23b20 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
23b30 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
23b40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
23b50 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
23b60 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
23b70 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
23b80 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
23b90 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
23ba0 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
23bb0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
23bc0 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
23bd0 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
23be0 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
23bf0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
23c00 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
23c10 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
23c20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23c30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23c50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23c60 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
23c70 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
23c80 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
23c90 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65  >info.nKey;.  re
23ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
23cc0 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
23cd0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
23ce0 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
23cf0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
23d00 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
23d10 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  o..**.** The cal
23d20 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
23d30 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
23d40 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
23d50 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
23d60 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
23d70 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
23d80 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
23d90 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
23da0 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
23db0 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
23dc0 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
23dd0 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69  VALID..**.** Fai
23de0 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
23df0 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63  ible.  This func
23e00 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75  tion always retu
23e10 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
23e20 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20  * It might just 
23e30 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f  as well be a pro
23e40 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e  cedure (returnin
23e50 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63  g void) but we c
23e60 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65  ontinue.** to re
23e70 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
23e80 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20  result code for 
23e90 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
23ea0 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
23eb0 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
23ec0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23ed0 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  u32 *pSize){.  a
23ee0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
23ef0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
23f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23f10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23f20 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23f30 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23f40 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
23f50 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
23f60 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
23f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23f80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23f90 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65  iPage]->intKeyLe
23fa0 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65  af==1 );.  getCe
23fb0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
23fc0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
23fd0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.nPayload;.  
23fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
24000 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
24010 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
24020 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
24030 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
24040 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
24050 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
24060 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
24070 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
24080 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
24090 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
240a0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
240b0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
240c0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
240d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
240e0 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
240f0 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
24100 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
24110 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
24120 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24130 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
24140 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
24150 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
24160 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
24170 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
24180 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
24190 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
241a0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
241b0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
241c0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
241d0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
241e0 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
241f0 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
24200 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
24210 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
24220 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
24230 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
24240 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
24250 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
24260 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
24270 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
24280 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
24290 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
242a0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
242b0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
242c0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
242d0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
242e0 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
242f0 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
24300 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
24310 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
24320 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
24330 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
24340 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
24350 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
24360 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
24370 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
24380 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
24390 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
243a0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
243b0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
243c0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
243d0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
243e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
243f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
24400 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
24410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
24420 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
24430 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
24440 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
24450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24460 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
24470 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
24480 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
24490 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
244a0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
244b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
244c0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
244d0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
244e0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
244f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24500 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
24510 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24520 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
24530 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
24540 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
24550 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
24560 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
24570 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
24580 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
24590 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
245a0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
245b0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
245c0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
245d0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
245e0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
245f0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
24600 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
24610 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
24620 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
24630 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
24640 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
24650 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
24660 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
24670 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
24680 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
24690 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
246a0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
246b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
246c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
246d0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
246e0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
246f0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
24700 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
24710 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
24720 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
24730 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
24740 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
24750 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
24760 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
24770 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
24780 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
24790 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
247a0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
247b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
247c0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
247d0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
247e0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
247f0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
24800 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
24810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
24820 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
24830 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
24840 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
24850 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
24860 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
24870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24880 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
24890 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
248a0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
248b0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
248c0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
248d0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
248e0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
248f0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
24900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24910 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
24920 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
24930 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
24940 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
24950 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
24960 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
24970 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
24980 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
24990 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
249a0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
249b0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
249c0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
249d0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
249e0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
249f0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
24a00 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
24a10 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
24a20 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
24a30 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
24a40 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
24a50 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
24a60 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
24a70 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
24a80 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
24a90 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
24aa0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
24ab0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
24ac0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
24ad0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
24ae0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
24af0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
24b00 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
24b10 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
24b20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
24b30 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
24b40 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
24b50 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
24b60 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24b70 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
24b80 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
24b90 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
24ba0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
24bb0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
24bc0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
24bd0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
24be0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
24bf0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
24c00 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
24c10 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
24c20 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
24c30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24c40 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
24c50 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c70 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
24c80 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
24c90 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
24ca0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
24cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24cc0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
24cd0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
24ce0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
24cf0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
24d00 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
24d10 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
24d20 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
24d30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24d40 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
24d50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
24d70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
24d80 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
24d90 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
24da0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
24db0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
24dc0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
24dd0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
24de0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
24df0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
24e00 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
24e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24e30 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
24e40 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
24e50 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
24e60 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
24e70 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
24e80 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
24e90 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
24ea0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
24eb0 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
24ec0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
24ed0 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
24ee0 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
24ef0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
24f00 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24f10 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
24f20 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
24f30 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
24f40 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
24f50 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
24f60 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
24f70 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
24f80 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
24f90 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
24fa0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
24fb0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
24fc0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
24fd0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
24fe0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
24ff0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
25000 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
25010 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
25020 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
25030 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
25040 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
25050 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
25060 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
25070 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
25080 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
25090 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
250a0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
250b0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
250c0 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
250d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
250e0 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
250f0 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
25100 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
25110 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
25120 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
25130 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
25140 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
25150 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
25160 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
25170 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
25180 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
25190 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
251a0 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
251b0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
251c0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
251d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
251e0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
251f0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
25200 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
25210 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
25220 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
25230 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
25240 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
25250 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
25260 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
25270 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
25280 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
25290 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
252a0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
252b0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
252c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
252d0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
252e0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
252f0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
25300 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
25310 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
25320 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
25330 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
25340 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
25350 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
25360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
25370 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
25380 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25390 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
253a0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
253b0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
253c0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
253d0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
253e0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
253f0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
25400 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
25410 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
25420 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
25430 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
25440 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
25450 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
25460 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
25470 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
25480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
25490 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
254a0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
254b0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
254c0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
254d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
254e0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
254f0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
25500 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25510 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25520 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
25530 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
25540 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
25550 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
25560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25570 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
25580 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
25590 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
255a0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
255b0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
255c0 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
255d0 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
255e0 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25610 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
25620 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
25630 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
25640 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
25650 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25660 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25670 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
25680 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25690 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
256a0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
256b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
256c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
256d0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
256e0 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
256f0 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
25700 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
25710 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
25720 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
25730 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
25740 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
25750 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
25760 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25770 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
25780 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
25790 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
257a0 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
257b0 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
257c0 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
257d0 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73  ayload );..  ass
257e0 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20  ert( aPayload > 
257f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
25800 20 20 69 66 28 20 28 61 50 61 79 6c 6f 61 64 20    if( (aPayload 
25810 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20  - pPage->aData) 
25820 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  > (pBt->usableSi
25830 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze - pCur->info.
25840 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  nLocal) ){.    /
25850 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
25860 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
25870 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
25880 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  ta is an error. 
25890 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64   The.    ** cond
258a0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73  itional above is
258b0 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20   really:.    ** 
258c0 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75     &aPayload[pCu
258d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
258e0 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
258f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
25900 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72  .    ** but is r
25910 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63  ecast into its c
25920 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61  urrent form to a
25930 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65  void integer ove
25940 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20  rflow problems. 
25950 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
25960 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
25970 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
25980 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
25990 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
259a0 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
259b0 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
259c0 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
259d0 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
259e0 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
259f0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
25a00 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
25a10 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
25a20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
25a30 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
25a40 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
25a50 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
25a60 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
25a70 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20  , pBuf, a, (eOp 
25a80 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e  & 0x01), pPage->
25a90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
25aa0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
25ab0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
25ac0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
25ad0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
25ae0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
25af0 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
25b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
25b10 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
25b20 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
25b30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
25b40 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
25b50 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
25b60 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
25b70 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
25b80 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
25b90 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
25ba0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
25bb0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
25bc0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
25bd0 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
25be0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
25bf0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
25c00 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
25c10 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  o not allocate a
25c20 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65  Overflow[] for e
25c30 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  Op==2..    **.  
25c40 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
25c50 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
25c60 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
25c70 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
25c80 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
25c90 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
25ca0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
25cb0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
25cc0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
25cd0 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
25ce0 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
25cf0 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
25d00 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
25d10 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
25d20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
25d30 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
25d40 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
25d50 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
25d60 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d  */.    if( eOp!=
25d70 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  2 && (pCur->curF
25d80 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
25d90 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
25da0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
25db0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
25dc0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
25dd0 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
25de0 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
25df0 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72    if( nOvfl>pCur
25e00 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a  ->nOvflAlloc ){.
25e10 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
25e20 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
25e30 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
25e40 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
25e50 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32  verflow, nOvfl*2
25e60 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20  *sizeof(Pgno).  
25e70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
25e80 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
25e90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25ea0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
25eb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25ec0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
25ed0 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f  >nOvflAlloc = nO
25ee0 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20  vfl*2;.         
25ef0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
25f00 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
25f10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
25f20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25f30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OK ){.        me
25f40 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
25f50 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
25f60 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
25f70 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
25f80 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
25f90 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a  idOvfl;.      }.
25fa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
25fb0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
25fc0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
25fd0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
25fe0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
25ff0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
26000 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
26010 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
26020 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
26030 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
26040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26050 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
26060 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
26070 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75  )!=0.     && pCu
26080 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
26090 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20  set/ovflSize].  
260a0 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20    ){.      iIdx 
260b0 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
260c0 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
260d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
260e0 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
260f0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
26100 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
26110 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
26120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26130 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
26140 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
26150 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
26160 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
26170 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
26180 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
26190 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
261a0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
261b0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
261c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
261d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
261e0 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
261f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
26200 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26210 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
26230 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
26240 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
26250 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65  rflow[iIdx] = ne
26260 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  xtPage;.      }.
26270 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
26280 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
26290 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
262a0 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
262b0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
262c0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
262d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
262e0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
262f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
26300 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
26310 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
26320 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
26330 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
26340 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
26350 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
26360 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
26370 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
26380 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
26390 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
263a0 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
263b0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
263c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
263d0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
263e0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
263f0 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  y must be alloca
26400 74 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21  ted because eOp!
26410 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65  =2.        ** he
26420 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20  re.  If eOp==2, 
26430 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61  then offset==0 a
26440 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69  nd this branch i
26450 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20  s never taken.. 
26460 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26470 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
26480 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
26490 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  rt( pCur->curFla
264a0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
264b0 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  vfl );.        a
264c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74  ssert( pCur->pBt
264d0 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62  ree->db==pBt->db
264e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
264f0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26500 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
26510 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
26520 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26530 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
26540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26550 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
26560 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
26570 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
26580 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
26590 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
265a0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
265b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
265c0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
265d0 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
265e0 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
265f0 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
26600 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
26610 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
26620 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
26630 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
26640 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
26650 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26660 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
26670 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
26680 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
26690 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
266a0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
266b0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
266c0 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
266d0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
266e0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
266f0 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
26700 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
26710 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
26720 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
26730 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
26740 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
26750 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
26760 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
26770 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
26780 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
26790 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
267a0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
267b0 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
267c0 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
267d0 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
267e0 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
267f0 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
26800 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
26810 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
26820 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
26830 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
26840 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
26850 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
26860 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
26870 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61    **   6) all da
26880 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ta from the page
26890 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
268a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20          **   7) 
268b0 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
268c0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
268d0 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65  en read into the
268e0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a   output buffer .
268f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26900 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
26910 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
26920 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
26930 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
26940 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
26950 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
26960 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
26970 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
26980 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
26990 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
269a0 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
269b0 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
269c0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
269d0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
269e0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30        if( (eOp&0
269f0 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20  x01)==0         
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
26a30 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a60 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
26a70 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e           && (bEn
26a80 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65  d || a==ovflSize
26a90 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ab0 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
26ac0 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
26ad0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
26ae0 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
26af0 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
26b00 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
26b10 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
26b20 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
26b30 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
26b40 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
26b50 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
26b60 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
26b70 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
26b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
26b90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26ba0 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
26bb0 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20     /* (7) */.   
26be0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26bf0 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
26c00 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
26c10 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
26c20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26c30 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
26c40 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c60 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a  /* hence (7) */.
26c70 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
26c80 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
26c90 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
26ca0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
26cb0 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
26cc0 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
26cd0 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
26ce0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
26cf0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
26d00 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
26d10 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
26d20 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
26d30 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
26d40 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
26d50 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
26d60 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
26d70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26d80 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
26d90 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
26da0 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
26db0 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78          ((eOp&0x
26dc0 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  01)==0 ? PAGER_G
26dd0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
26de0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
26df0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
26e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26e10 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
26e20 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
26e30 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
26e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
26e50 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
26e60 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
26e70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
26e80 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
26e90 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
26ea0 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30  Buf, a, (eOp&0x0
26eb0 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  1), pDbPage);.  
26ec0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26ed0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
26ee0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
26ef0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
26f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26f10 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
26f20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
26f30 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
26f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
26f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26f60 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
26f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26f80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
26f90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26fa0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
26fb0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
26fc0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
26fd0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
26fe0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
26ff0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
27000 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
27010 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
27020 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
27030 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
27040 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
27050 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
27060 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
27070 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
27080 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
27090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
270a0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
270b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
270c0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
270d0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
270e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
270f0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
27100 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
27110 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
27120 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
27130 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
27140 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27150 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
27160 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
27170 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27180 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
271a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
271b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
271c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
271d0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
271e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
271f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27200 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27210 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
27220 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27230 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
27240 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
27250 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
27260 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
27270 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
27280 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
27290 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
272a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
272b0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
272c0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
272d0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
272e0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
272f0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
27300 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
27310 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
27320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
27330 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
27340 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
27350 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
27360 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
27370 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
27380 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
27390 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
273a0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
273b0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
273c0 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
273d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
273e0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
273f0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
27400 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
27410 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
27420 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
27430 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27440 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
27450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27460 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
27470 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
27480 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
27490 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
274a0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
274b0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
274c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
274d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
274e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
274f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
27500 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27510 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
27520 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27530 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
27540 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
27550 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
27560 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27570 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
27580 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
27590 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
275a0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
275b0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
275c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
275d0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
275e0 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
275f0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
27600 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
27610 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
27620 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
27630 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
27640 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
27650 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
27660 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
27670 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
27680 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
27690 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
276a0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
276b0 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
276c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
276d0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
276e0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
276f0 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
27700 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
27710 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
27720 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
27730 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
27740 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
27750 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
27760 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
27770 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
27780 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
27790 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
277a0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
277b0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
277c0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
277d0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
277e0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
277f0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
27800 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
27810 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
27820 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
27830 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
27840 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
27850 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
27860 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
27870 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
27880 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
27890 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
278a0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
278b0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
278c0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
278d0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
278e0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
278f0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
27900 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
27910 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
27920 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
27930 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
27940 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
27950 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
27960 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
27970 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
27980 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
27990 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
279a0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
279b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
279c0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
279d0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
279e0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
279f0 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
27a00 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
27a10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
27a20 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
27a30 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
27a40 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
27a50 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
27a60 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
27a70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27a80 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
27a90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27aa0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27ab0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27ac0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
27ad0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
27ae0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
27af0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
27b00 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
27b10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27b20 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27b30 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
27b40 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
27b50 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27b60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
27b70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
27b80 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
27b90 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65  oad>pCur->apPage
27ba0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
27bb0 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Data || CORRUPT_
27bc0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
27bd0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
27be0 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  oad<pCur->apPage
27bf0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
27c00 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50  DataEnd ||CORRUP
27c10 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28  T_DB);.  amt = (
27c20 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67  int)(pCur->apPag
27c30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27c40 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
27c50 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b  >info.pPayload);
27c60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
27c70 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61  o.nLocal<amt ) a
27c80 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
27c90 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20  nLocal;.  *pAmt 
27ca0 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  = amt;.  return 
27cb0 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66  (void*)pCur->inf
27cc0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  o.pPayload;.}...
27cd0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
27ce0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
27cf0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
27d00 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
27d10 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
27d20 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
27d30 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
27d40 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
27d50 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
27d60 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
27d70 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
27d80 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
27d90 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
27da0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
27db0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
27dc0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
27dd0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
27de0 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
27df0 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
27e00 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
27e10 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
27e20 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
27e30 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
27e40 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
27e50 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
27e60 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
27e70 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
27e80 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
27e90 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
27ea0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
27eb0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
27ec0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
27ed0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
27ee0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
27ef0 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
27f00 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
27f10 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
27f20 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
27f30 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
27f40 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a  ur, u32 *pAmt){.
27f50 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61    return fetchPa
27f60 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
27f70 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  );.}.const void 
27f80 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
27f90 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
27fa0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
27fb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
27fc0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
27fd0 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
27fe0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
27ff0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
28000 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
28010 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
28020 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
28030 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
28040 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
28050 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
28060 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
28070 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
28080 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
28090 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
280a0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
280b0 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
280c0 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
280d0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
280e0 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
280f0 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
28100 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
28110 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
28120 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
28130 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
28140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
28150 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
28160 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
28170 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
28180 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
28190 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
281a0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
281b0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
281c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
281d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
281e0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
281f0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
28200 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
28210 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28220 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
28230 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
28240 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
28250 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
28260 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28270 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
28280 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28290 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
282a0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
282b0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
282c0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
282d0 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70  ur->iPage++;.  p
282e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
282f0 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72  >iPage] = 0;.  r
28300 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74  eturn getAndInit
28310 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
28320 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  o, &pCur->apPage
28330 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20  [pCur->iPage],. 
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28350 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75         pCur, pCu
28360 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
28370 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
28380 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
28390 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
283a0 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
283b0 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
283c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
283d0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
283e0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
283f0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
28400 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
28410 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
28420 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
28430 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
28440 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
28450 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
28460 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
28470 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
28480 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
28490 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
284a0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
284b0 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
284c0 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
284d0 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
284e0 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
284f0 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
28500 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
28510 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
28520 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
28530 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht not be true. 
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
28560 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
28570 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
28580 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
28590 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
285a0 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
285b0 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
285c0 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
285d0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
285e0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
285f0 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
28600 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
28610 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
28620 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
28630 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
28640 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
28650 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
28660 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
28670 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
28680 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
28690 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
286a0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
286b0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
286c0 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
286d0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
286e0 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
286f0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
28700 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
28710 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
28720 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
28730 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
28740 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
28750 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
28760 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
28770 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
28780 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28790 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
287a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
287b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
287c0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
287d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
287e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
287f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
28800 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
28810 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
28820 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28830 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
28840 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
28850 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
28860 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28870 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
28880 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28890 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
288a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
288b0 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
288c0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
288d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
288e0 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
288f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28900 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  -1]->nCell );.  
28910 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28920 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
28930 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
28940 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
28950 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
28960 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
28970 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
28980 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d  ur->iPage--]);.}
28990 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
289a0 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
289b0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
289c0 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
289d0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
289e0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
289f0 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
28a00 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
28a10 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
28a20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
28a30 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
28a40 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
28a50 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
28a60 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
28a70 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
28a80 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
28a90 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
28aa0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
28ab0 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
28ac0 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
28ad0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
28ae0 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
28af0 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
28b00 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
28b10 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
28b20 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
28b30 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
28b40 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
28b50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
28b60 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
28b70 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
28b80 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
28b90 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
28ba0 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
28bb0 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
28bc0 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
28bd0 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
28be0 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
28bf0 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
28c00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
28c10 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
28c20 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
28c30 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
28c40 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
28c50 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
28c60 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
28c70 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
28c80 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
28c90 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
28ca0 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
28cb0 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
28cc0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
28cd0 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
28ce0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
28cf0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
28d00 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
28d10 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
28d20 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
28d30 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
28d40 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
28d50 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
28d60 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
28d70 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
28d80 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
28d90 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
28da0 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
28db0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
28dc0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
28dd0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
28de0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
28df0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28e00 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
28e10 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28e20 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
28e30 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
28e40 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
28e50 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
28e60 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
28e70 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
28e80 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
28e90 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
28ea0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
28eb0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
28ec0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
28ed0 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
28ee0 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
28ef0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28f00 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
28f10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28f20 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
28f30 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
28f40 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
28f50 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
28f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
28f70 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
28f80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
28f90 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
28fa0 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
28fb0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Page ){.      as
28fc0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
28fd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21  ge[pCur->iPage]!
28fe0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  =0 );.      rele
28ff0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
29000 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29010 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
29020 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
29030 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
29040 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
29050 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
29060 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72  VALID;.    retur
29070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29080 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
29090 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
290a0 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  -1) );.    rc = 
290b0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
290c0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
290d0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
290e0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
290f0 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0],.            
29100 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
29110 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
29120 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
29130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29140 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
29150 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
29160 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
29170 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
29180 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
29190 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
291a0 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ey = pCur->apPag
291b0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20  e[0]->intKey;.  
291c0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
291d0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
291e0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
291f0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
29200 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
29210 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
29220 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
29230 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
29240 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
29250 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
29260 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
29270 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
29280 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
29290 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
292a0 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
292b0 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
292c0 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
292d0 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
292e0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
292f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
29300 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
29310 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
29320 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
29330 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
29340 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
29350 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
29360 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
29370 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
29380 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
29390 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
293a0 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
293b0 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
293c0 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
293d0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
293e0 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
293f0 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
29400 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
29410 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
29420 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
29430 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
29440 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
29450 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
29460 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
29470 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
29480 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
29490 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
294a0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
294b0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
294c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
294d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
294e0 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49    }..  pCur->aiI
294f0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
29500 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
29510 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
29520 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
29530 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
29540 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29550 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  fl);..  if( pRoo
29560 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
29570 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
29580 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
29590 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
295a0 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
295b0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
295c0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
295d0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
295e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
295f0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
29600 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
29610 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
29620 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
29630 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
29640 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
29650 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
29660 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
29670 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29680 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29690 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
296a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
296b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
296c0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
296d0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
296e0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
296f0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
29700 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
29710 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
29720 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
29730 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
29740 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
29750 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
29760 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
29770 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
29780 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
29790 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
297a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
297b0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
297c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
297d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
297e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
297f0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29800 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29810 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
29820 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29830 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
29840 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
29850 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
29860 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
29870 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
29880 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
29890 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
298a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
298b0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
298c0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
298d0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
298e0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
298f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
29900 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
29910 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29930 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
29940 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
29950 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
29960 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
29970 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
29980 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
29990 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
299a0 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
299b0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
299c0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
299d0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
299e0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
299f0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
29a00 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
29a10 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
29a20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
29a30 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
29a40 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
29a50 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
29a60 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
29a70 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
29a80 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
29a90 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
29aa0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
29ab0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
29ac0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
29ad0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
29ae0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
29af0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
29b00 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
29b10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29b20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
29b30 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
29b40 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29b50 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
29b60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29b70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29b80 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
29b90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
29ba0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29bb0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
29bc0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
29bd0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
29be0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
29bf0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  );.    pCur->aiI
29c00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29c10 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
29c20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
29c30 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
29c40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
29c50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
29c60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29c70 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
29c80 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73  ->nCell-1;.  ass
29c90 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29ca0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73  nSize==0 );.  as
29cb0 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
29cc0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
29cd0 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20  idNKey)==0 );.  
29ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29cf0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
29d00 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
29d10 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
29d20 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
29d30 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
29d40 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
29d50 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
29d60 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
29d70 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
29d80 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
29d90 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
29da0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
29db0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
29dc0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
29dd0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
29de0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
29df0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29e00 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29e10 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29e20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29e30 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
29e40 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
29e50 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
29e60 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
29e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29e80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
29e90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
29ea0 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
29eb0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
29ec0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
29ed0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29ee0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
29ef0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
29f00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
29f10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29f20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29f30 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
29f40 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
29f50 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
29f60 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
29f70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
29f80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29f90 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29fa0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
29fb0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
29fc0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
29fd0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
29fe0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
29ff0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
2a000 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2a010 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2a020 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2a030 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2a040 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2a050 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2a060 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2a070 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2a080 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
2a090 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a0a0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a0b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a0c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2a0d0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2a0e0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
2a0f0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
2a100 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
2a110 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
2a120 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
2a130 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
2a140 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2a150 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
2a160 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2a170 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
2a180 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2a190 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
2a1a0 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
2a1b0 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
2a1c0 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
2a1d0 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
2a1e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a1f0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
2a200 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
2a210 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2a220 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
2a230 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a240 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
2a250 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
2a260 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
2a270 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2a280 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a290 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
2a2a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a2b0 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
2a2c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a2d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a2e0 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
2a2f0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2a300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2a310 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2a320 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2a330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a340 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2a350 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2a360 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
2a370 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2a380 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2a390 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a3a0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2a3b0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2a3c0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2a3d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a3e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a3f0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
2a400 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a410 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2a420 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2a430 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a450 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2a460 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2a470 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a480 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2a490 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
2a4a0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
2a4b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2a4c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2a4d0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
2a4e0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2a4f0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
2a500 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
2a510 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
2a520 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
2a530 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
2a540 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
2a550 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
2a560 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
2a570 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
2a580 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
2a590 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
2a5a0 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
2a5b0 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
2a5c0 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
2a5d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2a5e0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
2a5f0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
2a600 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
2a610 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
2a620 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
2a630 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
2a640 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
2a650 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
2a660 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
2a670 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
2a680 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
2a690 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
2a6a0 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
2a6b0 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
2a6c0 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
2a6d0 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
2a6e0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2a6f0 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
2a700 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
2a710 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
2a720 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
2a730 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
2a740 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
2a750 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
2a760 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
2a770 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2a780 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
2a790 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2a7a0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2a7b0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7d0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
2a7e0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
2a7f0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2a800 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
2a820 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
2a830 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
2a840 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
2a850 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
2a860 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
2a870 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2a880 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2a890 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2a8a0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
2a8b0 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
2a8c0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
2a8d0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
2a8e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2a8f0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a900 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a920 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
2a930 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2a940 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74  *.** For index t
2a950 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b  ables, the pIdxK
2a960 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64  ey->eqSeen field
2a970 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20   is set to 1 if 
2a980 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20  there.** exists 
2a990 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
2a9a0 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74  table that exact
2a9b0 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b  ly matches pIdxK
2a9c0 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ey.  .*/.int sql
2a9d0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
2a9e0 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
2a9f0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2aa00 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
2aa10 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
2aa20 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2aa30 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
2aa40 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
2aa50 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
2aa60 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
2aa70 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
2aa80 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
2aa90 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
2aaa0 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
2aab0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
2aac0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
2aad0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
2aae0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2aaf0 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
2ab00 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2ab10 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f  t rc;.  RecordCo
2ab20 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d  mpare xRecordCom
2ab30 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pare;..  assert(
2ab40 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2ab50 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2ab60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2ab70 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2ab80 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2ab90 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2aba0 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
2abb0 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
2abc0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2abd0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
2abe0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2abf0 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
2ac00 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
2ac10 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
2ac20 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
2ac30 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
2ac40 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
2ac50 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
2ac60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2ac70 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
2ac80 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2ac90 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
2aca0 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 63 75 72  .   && pCur->cur
2acb0 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  IntKey .  ){.   
2acc0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2acd0 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2ace0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2acf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2ad00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2ad10 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2ad20 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
2ad30 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72  Last)!=0 && pCur
2ad40 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2ad50 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2ad60 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
2ad70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ad80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2ad90 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
2ada0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2adb0 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
2adc0 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
2add0 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
2ade0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
2adf0 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
2ae00 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
2ae10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2ae20 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2ae30 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
2ae40 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2ae50 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
2ae60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
2ae70 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
2ae80 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
2ae90 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
2aea0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2aeb0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2aec0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2aed0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2aee0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2aef0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2af00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2af10 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
2af20 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2af30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2af40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
2af50 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
2af60 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2af70 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2af80 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2af90 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2afa0 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
2afb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2afc0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
2afd0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2afe0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2aff0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2b000 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b010 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2b020 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
2b030 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2b040 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b050 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
2b060 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey==pCur->curInt
2b070 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2b080 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2b090 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
2b0a0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
2b0b0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
2b0c0 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
2b0d0 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
2b0e0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2b0f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b100 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  ge];.    u8 *pCe
2b110 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b130 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
2b140 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
2b150 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
2b160 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
2b170 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2b180 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
2b190 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
2b1a0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
2b1b0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
2b1c0 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
2b1d0 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
2b1e0 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
2b1f0 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
2b200 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
2b210 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
2b220 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
2b230 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
2b240 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
2b250 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
2b260 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
2b270 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
2b280 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
2b290 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
2b2a0 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
2b2b0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
2b2c0 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
2b2d0 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
2b2e0 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
2b2f0 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
2b300 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2b310 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2b320 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
2b330 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2b340 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
2b350 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
2b360 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
2b370 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
2b380 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
2b390 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
2b3a0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
2b3b0 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
2b3c0 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
2b3d0 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
2b3e0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2b3f0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2b400 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2b410 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
2b420 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
2b430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2b440 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
2b450 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
2b460 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b470 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2b480 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20  e, idx);.       
2b490 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2b4a0 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
2b4b0 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
2b4c0 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
2b4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b4e0 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
2b4f0 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e  DataEnd ) return
2b500 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b510 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2b520 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b530 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
2b540 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
2b550 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
2b560 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
2b570 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2b580 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2b590 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2b5a0 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72  pr ){ c = -1; br
2b5b0 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2b5c0 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
2b5d0 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y>intKey ){.    
2b5e0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2b5f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2b600 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2b610 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  +1; break; }.   
2b620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2b640 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
2b650 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2b660 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2b670 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
2b680 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2b690 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2b6a0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
2b6b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2b6c0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2b6d0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
2b6e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2b6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72  .            lwr
2b700 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
2b710 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2b720 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20  next_layer;.    
2b730 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b740 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2b750 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2b760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b770 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2b780 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2b790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2b7b0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2b7c0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2b7d0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2b7e0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2b7f0 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
2b800 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2b810 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2b820 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20      int nCell;  
2b830 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
2b840 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74  Cell cell in byt
2b850 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  es */.        pC
2b860 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2b870 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2b880 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
2b890 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
2b8a0 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
2b8b0 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
2b8c0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
2b8d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
2b8e0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2b8f0 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
2b900 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
2b910 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
2b920 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
2b930 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
2b940 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
2b950 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
2b960 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
2b970 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
2b980 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
2b990 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
2b9a0 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
2b9b0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
2b9c0 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
2b9d0 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
2b9e0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
2b9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2ba00 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
2ba10 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
2ba20 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
2ba30 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
2ba40 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
2ba50 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
2ba60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
2ba70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
2ba80 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2ba90 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
2baa0 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
2bab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2bac0 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
2bad0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2bae0 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
2baf0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
2bb00 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
2bb10 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2bb20 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
2bb30 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
2bb40 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
2bb50 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2bb60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bb70 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
2bb80 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2bb90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2bba0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2bbb0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2bbc0 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
2bbd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2bbe0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
2bbf0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
2bc00 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
2bc10 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
2bc20 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
2bc30 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
2bc40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bc50 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2bc60 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
2bc70 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
2bc80 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
2bc90 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
2bca0 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2bcb0 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
2bcc0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2bcd0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2bce0 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
2bcf0 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2bd00 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2bd10 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2bd20 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
2bd30 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2bd40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bd50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2bd60 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
2bd70 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
2bd80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2bd90 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
2bda0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
2bdb0 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
2bdc0 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
2bdd0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
2bde0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2bdf0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2be00 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
2be10 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
2be20 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
2be30 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
2be40 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
2be50 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
2be60 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ed. .          *
2be70 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
2be80 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
2be90 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65  corrupt, the xRe
2bea0 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74  cordCompare rout
2beb0 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20  ine may read.   
2bec0 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20         ** up to 
2bed0 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74  two varints past
2bee0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2bef0 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61  buffer. An extra
2bf00 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a   18 .          *
2bf10 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  * bytes of paddi
2bf20 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ng is allocated 
2bf30 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2bf40 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20  e buffer in.    
2bf50 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
2bf60 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a  is happens.  */.
2bf70 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
2bf80 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
2bf90 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
2bfa0 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
2bfb0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
2bfc0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
2bfd0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
2bfe0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2bff0 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
2c000 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
2c010 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
2c020 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
2c030 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c040 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20  nCell<0 );   /* 
2c050 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65  True if key size
2c060 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65   is 2^32 or more
2c070 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c080 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30  stcase( nCell==0
2c090 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2c0a0 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2c0b0 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20  0x80 0x00 */.   
2c0c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c0d0 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a   nCell==1 );  /*
2c0e0 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2c0f0 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2c100 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  01 */.          
2c110 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2c120 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =2 );  /* Minimu
2c130 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65  m legal index ke
2c140 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  y size */.      
2c150 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20      if( nCell<2 
2c160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2c170 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2c180 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2c190 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c1a0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c1b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2c1c0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
2c1d0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31  3Malloc( nCell+1
2c1e0 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8 );.          i
2c1f0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
2c200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2c210 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2c220 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2c230 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c240 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2c250 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
2c260 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c270 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2c280 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c290 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2c2a0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
2c2b0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
2c2c0 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20  ellKey, 2);.    
2c2d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c2f0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2c300 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2c310 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c320 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2c330 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2c340 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2c350 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
2c360 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2c370 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c380 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2c390 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2c3a0 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
2c3b0 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2c3c0 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
2c3d0 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
2c3e0 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
2c3f0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2c400 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
2c410 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
2c420 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
2c430 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2c440 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
2c450 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2c460 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c470 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
2c480 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2c490 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c4a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c4b0 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
2c4c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c4d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c4e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2c4f0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2c500 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2c510 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2c520 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
2c530 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
2c540 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
2c550 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c560 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2c570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2c580 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2c590 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c5a0 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2c5b0 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2c5c0 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2c5d0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2c5e0 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2c5f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2c600 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2c610 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2c620 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2c630 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c640 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2c650 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2c660 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2c670 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2c680 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
2c690 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c6a0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2c6b0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2c6c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2c6d0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2c6e0 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
2c6f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c700 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
2c710 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
2c720 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
2c730 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
2c740 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2c750 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2c760 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2c770 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2c780 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2c790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2c7a0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2c7b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2c7c0 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
2c7d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c7e0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2c7f0 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
2c800 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2c810 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
2c820 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2c830 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
2c840 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2c850 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2c860 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2c870 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2c880 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2c890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2c8a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2c8b0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2c8c0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2c8d0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2c8e0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2c8f0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2c900 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2c910 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2c920 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2c930 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2c940 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2c950 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2c960 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2c970 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2c980 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2c990 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2c9a0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2c9b0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2c9c0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2c9d0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2c9e0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2c9f0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2ca00 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2ca10 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2ca20 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2ca30 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2ca40 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2ca50 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2ca60 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2ca70 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2ca80 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2ca90 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2caa0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2cab0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2cac0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2cad0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
2cae0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2caf0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
2cb00 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2cb10 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2cb20 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2cb30 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2cb40 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2cb50 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
2cb60 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2cb70 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2cb80 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2cb90 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2cba0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2cbb0 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2cbc0 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2cbd0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2cbe0 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2cbf0 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2cc00 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2cc10 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2cc20 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2cc30 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2cc40 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2cc50 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2cc60 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2cc70 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2cc80 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2cc90 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2cca0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2ccb0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2ccc0 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2ccd0 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2cce0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2ccf0 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2cd00 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2cd10 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2cd20 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2cd30 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2cd40 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2cd50 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2cd60 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2cd70 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2cd80 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2cd90 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2cda0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2cdb0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2cdc0 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2cdd0 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2cde0 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2cdf0 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2ce00 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2ce10 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2ce20 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2ce30 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2ce40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2ce50 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2ce60 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2ce70 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2ce80 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2ce90 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2cea0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2ceb0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2cec0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2ced0 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2cee0 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2cef0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2cf00 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2cf10 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2cf20 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2cf30 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2cf40 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2cf50 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2cf60 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2cf70 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2cf80 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2cf90 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2cfa0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2cfb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2cfc0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2cfd0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2cfe0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2cff0 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2d000 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2d010 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d020 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2d030 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2d040 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2d050 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2d060 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2d070 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2d080 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d0a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d0b0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2d0c0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2d0d0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2d0e0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2d0f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d100 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2d110 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2d120 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d130 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2d140 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2d150 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2d160 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2d170 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2d180 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2d190 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2d1a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2d1b0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2d1c0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2d1d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d1e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2d1f0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2d200 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2d210 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2d220 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2d230 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2d240 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2d250 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d260 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2d270 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2d280 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2d290 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2d2a0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2d2b0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2d2c0 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2d2d0 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2d2e0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2d2f0 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2d300 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2d310 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2d320 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2d330 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2d340 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2d350 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2d360 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2d370 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2d380 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2d390 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2d3a0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2d3b0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2d3c0 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2d3d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2d3e0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2d3f0 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2d400 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2d410 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2d420 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2d430 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2d440 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2d450 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2d460 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2d470 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2d480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d490 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2d4a0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2d4b0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2d4c0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2d4d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2d4e0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2d4f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d500 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2d510 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d530 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2d540 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2d550 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2d560 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d570 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2d580 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2d590 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
2d5a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2d5b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2d5c0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2d5d0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2d5e0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2d5f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d610 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2d620 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2d630 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d640 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2d650 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2d660 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2d670 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2d680 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2d690 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2d6a0 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2d6b0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2d6c0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2d6d0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2d6e0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2d6f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d700 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2d710 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2d720 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2d730 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2d740 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d750 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2d760 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2d770 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2d780 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2d790 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2d7a0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2d7b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2d7c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d7d0 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
2d7e0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2d7f0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2d800 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d810 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70  age];.  if( (++p
2d820 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d830 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d  >iPage])>=pPage-
2d840 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43  >nCell ){.    pC
2d850 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d860 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65  iPage]--;.    re
2d870 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2d880 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2d890 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2d8a0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2d8b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2d8c0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2d8d0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d8e0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
2d8f0 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
2d900 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
2d910 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
2d920 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2d930 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2d940 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2d950 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2d960 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2d970 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2d980 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2d990 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2d9a0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2d9b0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2d9c0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2d9d0 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2d9e0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2d9f0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2da00 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
2da10 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2da20 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2da30 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2da40 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
2da50 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2da60 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2da70 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2da80 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
2da90 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2daa0 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2dab0 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
2dac0 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
2dad0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2dae0 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2daf0 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2db00 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
2db10 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
2db20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2db30 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2db40 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2db50 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2db60 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2db70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2db80 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2db90 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2dba0 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2dbb0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2dbc0 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2dbd0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2dbe0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2dbf0 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2dc00 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2dc10 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2dc20 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2dc30 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2dc40 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2dc50 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2dc60 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2dc70 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2dc80 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2dc90 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2dca0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2dcb0 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2dcc0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2dcd0 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2dce0 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2dcf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2dd00 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2dd10 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2dd20 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2dd30 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2dd40 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2dd50 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2dd60 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2dd70 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
2dd80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2dd90 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2dda0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2ddb0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2ddc0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ddd0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2dde0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2ddf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2de00 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
2de10 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2de20 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2de30 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2de40 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2de50 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2de60 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2de70 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2de80 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2de90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2dea0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2deb0 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2dec0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ded0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2dee0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2def0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2df00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2df10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2df20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2df30 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2df40 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2df50 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2df60 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2df70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2df80 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2df90 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2dfa0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2dfb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2dfc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2dfd0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2dfe0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2dff0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2e000 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2e010 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2e020 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2e030 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2e040 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2e050 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e060 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2e070 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2e080 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2e090 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2e0a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e0b0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2e0c0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2e0d0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2e0e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2e0f0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
2e100 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2e110 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2e120 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2e130 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2e140 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2e150 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2e160 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2e170 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2e180 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2e190 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2e1a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e1b0 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
2e1c0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2e1d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2e1e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2e1f0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2e200 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2e210 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2e220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2e230 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2e240 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2e250 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2e260 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2e270 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e280 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2e290 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  & (BTCF_ValidNKe
2e2a0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2e2b0 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
2e2c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2e2d0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
2e2e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2e2f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2e300 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2e310 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2e320 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2e330 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2e340 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2e350 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2e360 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2e370 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2e380 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e390 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e3a0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2e3b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2e3c0 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
2e3d0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2e3e0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2e3f0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2e400 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2e410 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2e420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e430 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2e440 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2e450 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2e460 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70    *pRes = 0;.  p
2e470 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2e480 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2e490 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2e4a0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
2e4b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e4c0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
2e4d0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e4e0 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
2e4f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2e500 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20  iPage]==0.   || 
2e510 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e520 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2e530 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2e540 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2e550 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2e560 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
2e570 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2e580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e590 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
2e5a0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2e5b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2e5c0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2e5d0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
2e5e0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2e5f0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
2e600 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
2e610 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
2e620 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2e630 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2e640 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
2e650 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
2e660 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
2e670 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2e680 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
2e690 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
2e6a0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
2e6b0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
2e6c0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
2e6d0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
2e6e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2e6f0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
2e700 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
2e710 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
2e720 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
2e730 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
2e740 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
2e750 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
2e760 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
2e770 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
2e780 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
2e790 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
2e7a0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
2e7b0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
2e7c0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2e7d0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
2e7e0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
2e7f0 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
2e800 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
2e810 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
2e820 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
2e830 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
2e840 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
2e850 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
2e860 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
2e870 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
2e880 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
2e890 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2e8a0 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
2e8b0 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
2e8c0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2e8d0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
2e8e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2e8f0 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
2e900 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
2e910 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
2e920 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
2e930 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
2e940 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
2e950 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
2e960 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
2e970 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
2e980 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
2e990 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
2e9a0 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
2e9b0 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
2e9c0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2e9d0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
2e9e0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
2e9f0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
2ea00 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
2ea10 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
2ea20 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
2ea30 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2ea40 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2ea50 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
2ea60 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
2ea70 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
2ea80 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
2ea90 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
2eaa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2eab0 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
2eac0 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
2ead0 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
2eae0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
2eaf0 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
2eb00 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
2eb10 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
2eb20 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
2eb30 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
2eb40 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2eb50 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2eb60 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
2eb70 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
2eb80 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
2eb90 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
2eba0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
2ebb0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2ebc0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2ebd0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
2ebe0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
2ebf0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2ec00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ec10 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
2ec20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2ec30 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2ec40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2ec50 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
2ec60 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
2ec70 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
2ec80 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
2ec90 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
2eca0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
2ecb0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
2ecc0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
2ecd0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2ece0 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
2ecf0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2ed00 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2ed10 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
2ed20 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
2ed30 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2ed40 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2ed50 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
2ed60 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2ed70 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
2ed80 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
2ed90 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
2eda0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
2edb0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2edc0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
2edd0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
2ede0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
2edf0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2ee00 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
2ee10 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
2ee20 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
2ee30 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
2ee40 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
2ee50 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
2ee60 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2ee70 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
2ee80 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
2ee90 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
2eea0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2eeb0 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
2eec0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
2eed0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2eee0 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
2eef0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
2ef00 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
2ef10 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
2ef20 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
2ef30 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2ef40 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
2ef50 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
2ef60 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
2ef70 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
2ef80 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
2ef90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2efa0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2efb0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2efc0 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
2efd0 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
2efe0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
2eff0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
2f000 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
2f010 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2f020 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
2f030 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
2f040 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
2f050 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
2f060 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2f070 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f080 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
2f090 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2f0a0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2f0b0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
2f0c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f0d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2f0e0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2f0f0 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
2f100 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2f110 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2f120 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
2f130 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
2f140 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
2f150 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
2f160 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
2f170 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
2f180 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
2f190 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
2f1a0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
2f1b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f1c0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
2f1d0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2f1e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f1f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2f200 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
2f210 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
2f220 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
2f230 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
2f240 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
2f250 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
2f260 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
2f270 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
2f280 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
2f290 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
2f2a0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
2f2b0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
2f2c0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
2f2d0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
2f2e0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
2f2f0 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
2f300 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
2f310 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
2f320 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
2f330 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
2f340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
2f350 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
2f360 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
2f370 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
2f380 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
2f390 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
2f3a0 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
2f3b0 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
2f3c0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f3d0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2f3e0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
2f3f0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
2f400 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2f410 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
2f420 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
2f430 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
2f440 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
2f450 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
2f460 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2f470 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
2f480 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
2f490 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f4a0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2f4b0 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
2f4c0 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
2f4d0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2f4e0 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
2f4f0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
2f500 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2f510 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
2f520 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
2f530 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
2f540 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
2f550 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
2f560 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
2f570 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2f580 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2f590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f5a0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
2f5b0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2f5c0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
2f5d0 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
2f5e0 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
2f5f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2f600 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2f610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2f620 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2f630 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  edPage(pBt, iTru
2f640 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2f650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f660 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2f670 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2f680 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f690 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f6a0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2f6b0 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
2f6c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2f6d0 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
2f6e0 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
2f6f0 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d  NCE-OF: R-13523-
2f700 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64  04394 The second
2f710 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2f720 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f730 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  e.      ** is th
2f740 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
2f750 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74   page pointers t
2f760 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20  o follow. */.   
2f770 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2f780 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2f790 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
2f7a0 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
2f7b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
2f7c0 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
2f7d0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
2f7e0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
2f7f0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
2f800 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
2f810 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
2f820 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
2f830 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
2f840 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
2f850 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
2f860 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f870 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
2f880 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f890 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f8a0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2f8b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2f8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2f8d0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f8e0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
2f8f0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2f900 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2f910 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2f920 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2f930 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f940 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2f950 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2f960 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2f970 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2f980 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2f990 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2f9a0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2f9b0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2f9c0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
2f9d0 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
2f9e0 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
2f9f0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2fa00 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
2fa10 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
2fa20 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
2fa30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2fa40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2fa50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fa60 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
2fa70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2fa80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2fa90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
2faa0 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
2fab0 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
2fac0 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
2fad0 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
2fae0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2faf0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
2fb00 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
2fb10 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
2fb20 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
2fb30 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
2fb40 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
2fb50 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
2fb60 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
2fb70 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
2fb80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fb90 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
2fba0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2fbb0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2fbc0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2fbd0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2fbe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2fbf0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2fc00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2fc10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2fc20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fc30 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2fc40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
2fc50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2fc60 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
2fc70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fc80 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2fc90 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2fca0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2fcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2fcc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2fcd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fce0 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2fcf0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2fd00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2fd10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fd20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2fd30 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2fd40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2fd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2fd60 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
2fd70 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2fd80 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2fd90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fda0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fdb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
2fdc0 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
2fdd0 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
2fde0 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
2fdf0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
2fe00 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
2fe10 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
2fe20 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
2fe30 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
2fe40 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2fe50 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
2fe60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fe70 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
2fe80 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
2fe90 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
2fea0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2feb0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
2fec0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2fed0 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
2fee0 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
2fef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2ff00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2ff10 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2ff20 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2ff30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ff40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
2ff50 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
2ff60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2ff70 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
2ff80 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
2ff90 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
2ffa0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
2ffb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ffc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ffd0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2ffe0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fff0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
30000 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30010 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
30020 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30030 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30050 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30060 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
30070 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
30080 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30090 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
300a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
300b0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
300c0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
300d0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
300e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
300f0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
30100 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
30110 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
30120 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
30130 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
30140 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
30150 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
30160 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
30170 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
30180 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
30190 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
301a0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
301b0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
301c0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
301d0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
301e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
301f0 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
30200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
30210 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30220 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30230 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
30240 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
30250 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
30260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30270 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30280 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
302a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
302b0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
302c0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
302d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
302e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
302f0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
30300 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
30310 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
30320 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
30330 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
30340 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
30350 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
30360 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
30370 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
30380 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
30390 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
303a0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
303b0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
303c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
303d0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
303e0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
303f0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
30400 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
30410 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
30420 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
30430 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
30440 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
30450 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
30460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30470 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
30480 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
30490 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
304a0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
304b0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
304c0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
304d0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
304e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
304f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30510 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30520 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
30530 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
30540 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
30550 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
30560 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
30570 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
30580 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
30590 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
305a0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
305b0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
305c0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
305d0 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
305e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
305f0 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
30600 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
30610 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
30620 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
30630 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
30640 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30650 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
30660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30670 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30680 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
30690 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
306a0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
306b0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
306c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
306d0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
306e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
306f0 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
30700 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30710 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30720 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
30730 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30740 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
30750 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
30760 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
30770 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
30780 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
30790 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
307a0 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
307b0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
307c0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
307d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
307e0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
307f0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
30800 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
30810 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
30820 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
30830 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
30840 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
30850 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
30860 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
30870 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
30880 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
30890 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
308a0 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
308b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
308c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
308d0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
308e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
308f0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
30900 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30910 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
30920 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
30930 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
30940 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
30950 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
30960 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
30970 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
30980 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
30990 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
309a0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
309b0 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
309c0 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
309d0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
309e0 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
309f0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30a00 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
30a10 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
30a20 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
30a30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30a60 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
30a70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
30a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30ab0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
30ac0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30ad0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
30ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30af0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30b00 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
30b10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
30b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
30b30 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
30b40 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
30b50 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
30b60 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
30b70 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
30b80 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
30b90 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
30ba0 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
30bb0 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
30bc0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
30bd0 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
30be0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
30bf0 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
30c00 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
30c10 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
30c20 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
30c30 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
30c40 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
30c50 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
30c60 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
30c70 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
30c80 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
30c90 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
30ca0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
30cb0 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
30cc0 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
30cd0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
30ce0 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
30cf0 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
30d00 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
30d10 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
30d20 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
30d30 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
30d40 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
30d50 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
30d60 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
30d70 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
30d80 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
30d90 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
30da0 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
30db0 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
30dc0 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
30dd0 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
30de0 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
30df0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
30e00 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
30e10 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
30e20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
30e30 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
30e40 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
30e50 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
30e60 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
30e70 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
30e80 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
30e90 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
30ea0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
30eb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
30ec0 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
30ed0 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
30ee0 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
30ef0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
30f00 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
30f10 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
30f20 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
30f30 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
30f40 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
30f50 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
30f60 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
30f70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
30f80 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
30f90 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
30fa0 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
30fb0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
30fc0 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
30fd0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
30fe0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
30ff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31000 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
31010 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
31020 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31030 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
31040 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
31050 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
31060 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
31070 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
31080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31090 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
310a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
310b0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
310c0 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
310d0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
310e0 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
310f0 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
31100 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
31110 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
31120 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
31130 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
31140 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
31150 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
31160 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
31170 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
31180 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
31190 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
311a0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
311b0 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
311c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
311d0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
311e0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
311f0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
31200 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
31210 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
31220 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
31230 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
31240 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31250 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
31260 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
31270 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
31280 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
31290 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
312a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
312b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
312c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
312d0 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
312e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
312f0 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
31300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31310 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
31320 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
31330 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
31340 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
31350 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
31360 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
31370 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
31380 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
31390 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
313a0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
313b0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
313c0 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
313d0 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
313e0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
313f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
31400 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
31410 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
31420 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
31430 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
31440 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31450 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
31460 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31470 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
31480 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31490 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
314a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
314b0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
314c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
314d0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
314e0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
314f0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
31500 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
31510 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
31520 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
31530 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
31540 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31550 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
31560 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
31570 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
31580 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  nk);.  assert( r
31590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
315a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
315b0 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
315c0 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20  e)->pDbPage)<=1 
315d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
315e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a  =SQLITE_OK || (*
315f0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
31600 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
31610 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
31620 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
31630 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
31640 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
31650 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
31660 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
31670 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
31680 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
31690 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
316a0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
316b0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
316c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
316d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
316e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
316f0 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
31700 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
31710 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
31720 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
31730 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
31740 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
31750 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
31760 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
31770 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
31780 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
31790 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
317a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
317b0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
317c0 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
317d0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
317e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
317f0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
31800 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
31810 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
31820 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
31830 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
31840 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
31850 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
31860 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
31870 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
31880 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31890 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
318a0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
318b0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
318c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318d0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
318e0 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
318f0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
31900 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
31910 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
31920 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
31930 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
31940 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
31950 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
31960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
31970 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
31980 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
31990 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
319c0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
319d0 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
319f0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
31a00 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
31a10 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
31a20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
31a30 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
31a40 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
31a50 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50  CORRUPT_DB || iP
31a60 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
31a70 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
31a80 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
31a90 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
31aa0 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e  iPage<2 ) return
31ab0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31ac0 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d  BKPT;.  if( pMem
31ad0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
31ae0 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
31af0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
31b00 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
31b10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31b20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
31b30 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
31b40 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
31b50 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
31b60 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
31b70 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
31b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31b90 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
31ba0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
31bb0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31bc0 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
31bd0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31be0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
31bf0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31c00 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
31c10 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
31c20 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
31c30 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
31c40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
31c50 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
31c60 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
31c70 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
31c80 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
31c90 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
31ca0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
31cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31cc0 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
31cd0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
31ce0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
31cf0 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
31d00 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
31d10 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
31d20 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
31d30 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
31d40 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
31d50 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
31d60 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
31d70 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
31d80 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
31d90 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
31da0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
31db0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
31dc0 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
31dd0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
31de0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
31df0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
31e00 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
31e10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
31e20 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
31e30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
31e40 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
31e50 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
31e60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
31e70 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
31e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
31e90 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
31ea0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
31eb0 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
31ec0 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
31ed0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
31ee0 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
31ef0 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
31f00 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
31f10 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
31f20 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
31f30 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
31f40 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
31f50 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
31f60 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
31f70 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
31f80 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
31f90 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
31fa0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
31fb0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
31fc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
31fd0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
31fe0 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
31ff0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
32000 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
32010 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
32020 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
32030 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
32040 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
32050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32060 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
32070 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
32080 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
32090 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
320a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
320b0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
320c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
320d0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
320e0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
320f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32100 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
32110 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
32120 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
32130 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
32140 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
32150 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
32160 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
32170 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
32180 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
32190 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
321a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
321b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
321c0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
321d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
321e0 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
321f0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
32200 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
32210 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
32220 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
32230 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
32240 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
32250 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
32260 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
32270 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
32280 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
32290 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
322a0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
322b0 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
322c0 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
322d0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
322e0 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
322f0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
32300 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
32310 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
32320 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
32330 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
32340 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
32350 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
32360 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
32370 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
32380 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
32390 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
323a0 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
323b0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
323c0 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
323d0 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
323e0 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
323f0 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
32400 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
32410 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
32420 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
32430 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
32440 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
32450 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
32460 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
32470 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
32480 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
32490 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
324a0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
324b0 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
324c0 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
324d0 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
324e0 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
324f0 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
32500 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
32510 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
32520 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
32530 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
32540 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
32550 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
32560 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
32570 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
32580 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
32590 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
325a0 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
325b0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
325c0 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
325d0 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
325e0 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
325f0 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
32600 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
32610 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
32620 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
32630 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
32640 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
32650 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
32660 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
32670 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
32680 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
32690 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
326a0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
326b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
326c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
326d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
326e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
326f0 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
32700 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
32710 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
32720 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
32730 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
32740 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
32750 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
32760 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
32770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
32780 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
32790 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
327a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
327b0 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
327c0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
327d0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
327e0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
327f0 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
32800 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
32810 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
32820 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
32830 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
32840 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
32850 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
32860 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
32870 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
32880 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
32890 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
328a0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
328b0 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
328c0 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
328d0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
328e0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
328f0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
32900 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
32910 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
32920 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
32930 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
32940 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
32950 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
32960 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
32970 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
32980 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
32990 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
329a0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
329b0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
329c0 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
329d0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
329e0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
329f0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
32a00 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
32a10 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32a20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
32a30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
32a40 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
32a50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32a60 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
32a70 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
32a80 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
32a90 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
32aa0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
32ab0 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
32ac0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
32ad0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
32ae0 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
32af0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
32b00 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
32b10 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
32b20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
32b30 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
32b40 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
32b50 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
32b60 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
32b70 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
32b80 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
32b90 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
32ba0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
32bb0 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
32bc0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
32bd0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
32be0 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
32bf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
32c00 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
32c10 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
32c20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
32c30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
32c40 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
32c50 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32c60 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
32c70 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  l.  Write the.**
32c80 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65   local Cell size
32c90 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20   (the number of 
32ca0 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69  bytes on the ori
32cb0 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74  ginal page, omit
32cc0 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  ting.** overflow
32cd0 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a  ) into *pnSize..
32ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
32cf0 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
32d00 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
32d10 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
32d20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
32d30 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
32d40 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
32d50 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
32d60 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
32d70 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20  /.  u16 *pnSize 
32d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32d90 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f  Write the size o
32da0 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20  f the Cell here 
32db0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
32dc0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
32dd0 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
32de0 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
32df0 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
32e00 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
32e10 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
32e20 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32e30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32e40 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
32e50 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
32e60 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
32e70 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
32e80 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
32e90 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66  nSize;.  if( inf
32ea0 6f 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66 6f 2e 6e  o.nLocal==info.n
32eb0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72  Payload ){.    r
32ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32ed0 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
32ee0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
32ef0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
32f00 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
32f10 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  f( pCell+info.nS
32f20 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61  ize-1 > pPage->a
32f30 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
32f40 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
32f50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
32f60 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
32f70 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
32f80 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
32f90 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
32fa0 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 69  t4byte(pCell + i
32fb0 6e 66 6f 2e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  nfo.nSize - 4);.
32fc0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
32fd0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
32fe0 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
32ff0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
33000 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
33010 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
33020 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
33030 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
33040 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
33050 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
33060 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
33070 50 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e  PT_DB && (info.n
33080 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61  Payload + ovflPa
33090 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65  geSize)<ovflPage
330a0 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69  Size).  );.  whi
330b0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
330c0 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
330d0 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
330e0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
330f0 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
33100 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
33110 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
33120 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
33130 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
33140 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
33150 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
33160 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
33170 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
33180 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
33190 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
331a0 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
331b0 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
331c0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
331d0 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
331e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
331f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
33200 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
33210 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
33220 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
33230 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
33240 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
33250 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33260 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
33270 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
33280 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
33290 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
332a0 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
332b0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
332c0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
332d0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
332e0 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
332f0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
33300 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
33310 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
33320 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
33330 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
33340 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
33350 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
33360 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
33370 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
33380 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
33390 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
333a0 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
333b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
333c0 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
333d0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
333e0 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
333f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
33400 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
33410 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
33420 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
33430 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
33440 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
33450 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
33460 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
33470 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
33480 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
33490 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
334a0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
334b0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
334c0 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
334d0 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
334e0 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
334f0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
33500 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
33510 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
33520 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
33530 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
33540 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
33550 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
33560 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
33570 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33580 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
33590 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
335a0 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
335b0 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
335c0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
335d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
335e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
335f0 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
33600 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
33610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
33620 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
33630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
33640 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
33650 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
33660 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
33670 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
33680 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
33690 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
336a0 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
336b0 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
336c0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
336d0 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
336e0 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
336f0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
33700 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
33710 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
33720 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
33730 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
33740 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
33750 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
33760 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
33770 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
33780 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
33790 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
337a0 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
337b0 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
337c0 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
337d0 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
337e0 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
337f0 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
33800 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
33810 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
33820 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
33830 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
33840 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
33850 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
33860 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
33870 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
33880 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
33890 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
338a0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
338b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
338c0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
338d0 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
338e0 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
338f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
33900 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
33910 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
33920 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
33930 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
33940 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
33950 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
33960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33970 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
33980 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
33990 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
339a0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
339b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
339c0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
339d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
339e0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
339f0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
33a00 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
33a10 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
33a20 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
33a30 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
33a40 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
33a50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
33a60 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
33a70 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
33a80 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
33a90 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
33aa0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
33ab0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
33ac0 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
33ad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33ae0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
33af0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
33b00 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
33b10 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
33b20 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
33b30 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
33b40 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
33b50 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
33b60 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
33b70 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
33b80 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
33b90 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
33ba0 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
33bb0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
33bc0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
33bd0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
33be0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
33bf0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
33c00 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
33c10 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
33c20 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
33c30 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
33c40 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
33c50 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
33c60 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
33c70 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
33c80 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
33c90 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
33ca0 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
33cb0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
33cc0 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  nData==0 );.    
33cd0 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30  assert( nZero==0
33ce0 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   );.  }.  nHeade
33cf0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
33d00 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
33d10 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
33d20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
33d30 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  he payload size 
33d40 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
33d50 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
33d60 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
33d70 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
33d80 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
33d90 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72  else{ .    asser
33da0 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66  t( nKey<=0x7ffff
33db0 66 66 66 20 26 26 20 70 4b 65 79 21 3d 30 20 29  fff && pKey!=0 )
33dc0 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ;.    nPayload =
33dd0 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
33de0 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
33df0 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
33e00 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  y;.  }.  if( nPa
33e10 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
33e20 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20  xLocal ){.    n 
33e30 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79  = nHeader + nPay
33e40 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61  load;.    testca
33e50 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20  se( n==3 );.    
33e60 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29  testcase( n==4 )
33e70 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20  ;.    if( n<4 ) 
33e80 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69  n = 4;.    *pnSi
33e90 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  ze = n;.    spac
33ea0 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64  eLeft = nPayload
33eb0 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
33ec0 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cell;.  }else{. 
33ed0 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67     int mn = pPag
33ee0 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
33ef0 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c   n = mn + (nPayl
33f00 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61  oad - mn) % (pPa
33f10 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
33f20 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
33f30 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
33f40 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
33f50 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
33f60 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
33f70 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20   );.    if( n > 
33f80 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
33f90 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70  ) n = mn;.    sp
33fa0 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20  aceLeft = n;.   
33fb0 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
33fc0 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20  Header + 4;.    
33fd0 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
33fe0 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a  nHeader+n];.  }.
33ff0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
34000 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20  ell[nHeader];.. 
34010 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
34020 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75  t variables shou
34030 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c  ld be set as fol
34040 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
34050 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20    nPayload      
34060 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f       Total paylo
34070 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ad size in bytes
34080 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64  .  **   pPayload
34090 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e             Begin
340a0 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64   writing payload
340b0 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61   here.  **   spa
340c0 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20  ceLeft          
340d0 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
340e0 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66  at pPayload.  If
340f0 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c   nPayload>spaceL
34100 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20  eft,.  **       
34110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
34120 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e  hat means conten
34130 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74  t must spill int
34140 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
34150 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65  ..  **   *pnSize
34160 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65              Size
34170 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   of the local ce
34180 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  ll (not counting
34190 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
341a0 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20  .  **   pPrior  
341b0 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
341c0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67   to write the pg
341d0 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  no of the first 
341e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
341f0 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61  **.  ** Use a ca
34200 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ll to btreeParse
34210 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72  CellPtr() to ver
34220 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c  ify that the val
34230 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  ues above.  ** w
34240 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72  ere computed cor
34250 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  rectly..  */.#if
34260 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
34270 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
34280 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  nfo;.    pPage->
34290 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
342a0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
342b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65  .    assert( nHe
342c0 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f  ader==(int)(info
342d0 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
342e0 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
342f0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
34300 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
34310 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
34320 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
34330 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
34340 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
34350 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
34360 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
34370 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
34380 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
34390 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
343a0 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
343b0 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
343c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
343d0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
343e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
343f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
34400 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
34410 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
34420 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
34430 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
34440 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
34450 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
34460 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
34470 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
34480 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
34490 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
344a0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
344b0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
344c0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
344d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
344e0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
344f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
34500 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
34510 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
34520 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
34530 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
34540 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34550 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34560 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
34570 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
34580 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
34590 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
345a0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
345b0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
345c0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
345d0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
345e0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
345f0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
34600 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
34610 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
34620 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
34630 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
34640 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
34650 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
34660 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
34670 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
34680 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
34690 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
346a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
346b0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
346c0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
346d0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
346e0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
346f0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
34700 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
34710 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
34720 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
34730 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
34740 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
34750 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34760 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
34770 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
34780 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
34790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
347a0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
347b0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
347c0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
347d0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
347e0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
347f0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
34800 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
34810 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
34820 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
34830 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34840 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
34850 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
34860 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
34870 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
34880 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34890 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
348a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
348b0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
348c0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
348d0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
348e0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
348f0 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
34900 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34910 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34920 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34930 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
34940 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
34950 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
34960 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34970 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
34980 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
34990 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
349a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
349b0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
349c0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
349d0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
349e0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
349f0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
34a00 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
34a10 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
34a20 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
34a30 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
34a40 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
34a50 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34a60 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
34a70 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
34a80 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
34a90 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
34aa0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34ab0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34ac0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
34ad0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
34ae0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
34af0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
34b00 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
34b10 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
34b20 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
34b30 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
34b40 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
34b50 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
34b60 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
34b70 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
34b80 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
34b90 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
34ba0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
34bb0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
34bc0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
34bd0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
34be0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
34bf0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
34c00 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
34c10 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
34c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
34c30 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
34c40 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34c50 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
34c60 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
34c70 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
34c80 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
34c90 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
34ca0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
34cb0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
34cc0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34cd0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
34ce0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
34cf0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
34d00 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
34d10 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
34d20 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
34d30 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
34d40 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
34d50 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
34d60 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
34d70 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
34d80 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
34d90 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
34da0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
34db0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
34dc0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
34dd0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
34de0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
34df0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
34e00 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
34e10 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
34e20 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
34e30 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
34e40 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
34e50 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
34e60 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
34e70 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
34e80 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
34e90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34ea0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
34eb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34ec0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
34ed0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
34ee0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
34ef0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
34f00 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
34f10 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
34f20 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
34f30 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
34f40 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
34f50 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
34f60 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
34f70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
34f80 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
34f90 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
34fa0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
34fb0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
34fc0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
34fd0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
34fe0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
34ff0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
35000 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
35010 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
35020 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
35030 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
35040 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
35050 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
35060 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
35070 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
35080 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
35090 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
350a0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
350b0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
350c0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
350d0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
350e0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
350f0 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
35100 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
35110 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
35120 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
35130 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
35140 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
35150 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
35160 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
35170 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
35180 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
35190 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
351a0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
351b0 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  B || sz==cellSiz
351c0 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
351d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
351e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
351f0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
35200 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
35210 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35220 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35230 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
35240 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
35250 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
35260 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
35270 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
35280 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
35290 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
352a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
352b0 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
352c0 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
352d0 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
352e0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
352f0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
35300 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
35310 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
35320 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
35330 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35340 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
35350 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35360 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
35370 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
35380 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
35390 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
353a0 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
353b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
353c0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
353d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
353e0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  Cell==0 ){.    m
353f0 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
35400 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64  1], 0, 4);.    d
35410 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
35420 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
35430 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65  ta[hdr+5], pPage
35440 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35450 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  e);.    pPage->n
35460 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Free = pPage->pB
35470 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35480 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
354a0 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d          - pPage-
354b0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20  >childPtrSize - 
354c0 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  8;.  }else{.    
354d0 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72  memmove(ptr, ptr
354e0 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  +2, 2*(pPage->nC
354f0 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20  ell - idx));.   
35500 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
35510 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
35520 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
35530 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
35540 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
35550 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
35560 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
35570 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
35580 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
35590 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
355a0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
355b0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
355c0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
355d0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
355e0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
355f0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
35600 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
35610 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
35620 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
35630 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
35640 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
35650 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
35660 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
35670 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
35680 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
35690 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
356a0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
356b0 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
356c0 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
356d0 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
356e0 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
356f0 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
35700 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
35710 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
35720 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
35730 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
35740 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
35750 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
35760 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
35770 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
35780 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
35790 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
357a0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
357b0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
357c0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
357d0 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
357e0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
357f0 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
35800 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
35810 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
35820 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
35830 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
35840 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
35850 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
35860 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
35870 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
35880 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
35890 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
358a0 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
358b0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
358c0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
358d0 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
358e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
358f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
35900 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
35910 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
35920 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
35930 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
35940 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
35950 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
35960 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
35970 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
35980 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
35990 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
359a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
359b0 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
359c0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
359d0 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ins;         /* 
359e0 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61  The point in pPa
359f0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77  ge->aCellIdx[] w
35a00 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73  here no cell ins
35a10 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20  erted */..  if( 
35a20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
35a30 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
35a40 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
35a50 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
35a60 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
35a70 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
35a80 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
35a90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
35aa0 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
35ab0 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
35ac0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
35ad0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
35ae0 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
35af0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
35b00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
35b10 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
35b20 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
35b30 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
35b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
35b50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35b60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
35b70 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
35b80 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
35b90 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
35ba0 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
35bb0 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
35bc0 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
35bd0 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
35be0 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
35bf0 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
35c00 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
35c10 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
35c20 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
35c30 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
35c40 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
35c50 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
35c60 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
35c70 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
35c80 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
35c90 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
35ca0 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
35cb0 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
35cc0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
35cd0 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
35ce0 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67  assert( sz==pPag
35cf0 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
35d00 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
35d10 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
35d20 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
35d30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
35d40 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
35d50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
35d60 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
35d70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20  y(pTemp, pCell, 
35d80 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  sz);.      pCell
35d90 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
35da0 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
35db0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
35dc0 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
35dd0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
35de0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
35df0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
35e00 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
35e10 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a  age->apOvfl)/siz
35e20 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
35e30 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
35e40 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
35e50 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
35e60 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
35e70 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57  u16)i;..    /* W
35e80 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  hen multiple ove
35e90 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68  rflows occur, th
35ea0 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65  ey are always se
35eb0 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a  quential and in.
35ec0 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72      ** sorted or
35ed0 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72  der.  This invar
35ee0 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61  iants arise beca
35ef0 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  use multiple ove
35f00 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a  rflows can.    *
35f10 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  * only occur whe
35f20 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69  n inserting divi
35f30 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
35f40 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64  he parent page d
35f50 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c  uring.    ** bal
35f60 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  ancing, and the 
35f70 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a  dividers are adj
35f80 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64  acent and sorted
35f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
35fa0 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61  ert( j==0 || pPa
35fb0 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c  ge->aiOvfl[j-1]<
35fc0 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65  (u16)i ); /* Ove
35fd0 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64  rflows in sorted
35fe0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73   order */.    as
35ff0 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d  sert( j==0 || i=
36000 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a  =pPage->aiOvfl[j
36010 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76  -1]+1 );   /* Ov
36020 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75  erflows are sequ
36030 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73  ential */.  }els
36040 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
36050 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36060 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36070 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36090 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
360a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
360b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
360c0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
360d0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
360e0 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
360f0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
36100 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61  .    assert( &da
36110 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
36120 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43  fset]==pPage->aC
36130 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63  ellIdx );.    rc
36140 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
36150 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
36160 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36170 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
36180 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
36190 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
361a0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
361b0 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
361c0 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  g properties.   
361d0 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
361e0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a  s successfully *
361f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
36200 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  x >= 0 );.    as
36210 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61  sert( idx >= pPa
36220 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
36230 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20  *pPage->nCell+2 
36240 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
36250 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
36260 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
36270 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
36280 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
36290 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
362a0 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
362b0 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
362c0 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
362d0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
362e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
362f0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
36300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73  ;.    }.    pIns
36310 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49   = pPage->aCellI
36320 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65  dx + i*2;.    me
36330 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49  mmove(pIns+2, pI
36340 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  ns, 2*(pPage->nC
36350 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70  ell - i));.    p
36360 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64  ut2byte(pIns, id
36370 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  x);.    pPage->n
36380 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69  Cell++;.    /* i
36390 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c  ncrement the cel
363a0 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  l count */.    i
363b0 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65  f( (++data[pPage
363c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d  ->hdrOffset+4])=
363d0 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d  =0 ) data[pPage-
363e0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b  >hdrOffset+3]++;
363f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
36400 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
36410 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
36420 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
36430 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
36440 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36450 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
36460 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36470 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
36480 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
36490 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
364a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
364b0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
364c0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
364d0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
364e0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
364f0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
36500 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
36510 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
36520 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
36530 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
36540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c  .}../*.** A Cell
36550 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  Array object con
36560 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66  tains a cache of
36570 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69   pointers and si
36580 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e  zes for a.** con
36590 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63  secutive sequenc
365a0 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20  e of cells that 
365b0 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75  might be held mu
365c0 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f  ltiple pages..*/
365d0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
365e0 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72  CellArray CellAr
365f0 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c  ray;.struct Cell
36600 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43  Array {.  int nC
36610 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36620 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
36630 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
36640 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
36650 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Ref;          /*
36660 20 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20   Reference page 
36670 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
36680 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
36690 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
366a0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
366b0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
366c0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
366d0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
366e0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
366f0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
36700 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a  ure the cell siz
36710 65 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31  es at idx, idx+1
36720 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68  , ..., idx+N-1 h
36730 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70  ave been.** comp
36740 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
36750 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c  void populateCel
36760 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79  lCache(CellArray
36770 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e   *p, int idx, in
36780 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
36790 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c  idx>=0 && idx+N<
367a0 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77  =p->nCell );.  w
367b0 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20  hile( N>0 ){.   
367c0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65   assert( p->apCe
367d0 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20  ll[idx]!=0 );.  
367e0 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
367f0 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  idx]==0 ){.     
36800 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20   p->szCell[idx] 
36810 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  = p->pRef->xCell
36820 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
36830 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20  >apCell[idx]);. 
36840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36850 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
36860 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  DB ||.          
36870 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
36880 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65  x]==p->pRef->xCe
36890 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
368a0 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20  p->apCell[idx]) 
368b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
368c0 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d  ++;.    N--;.  }
368d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
368e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
368f0 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20   Nth element of 
36900 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a  the cell array.*
36910 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
36920 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d  NOINLINE u16 com
36930 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c  puteCellSize(Cel
36940 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e  lArray *p, int N
36950 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d  ){.  assert( N>=
36960 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20  0 && N<p->nCell 
36970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
36980 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a  szCell[N]==0 );.
36990 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d    p->szCell[N] =
369a0 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
369b0 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
369c0 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65  apCell[N]);.  re
369d0 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  turn p->szCell[N
369e0 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20  ];.}.static u16 
369f0 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43  cachedCellSize(C
36a00 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
36a10 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
36a20 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
36a30 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  l );.  if( p->sz
36a40 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e  Cell[N] ) return
36a50 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20   p->szCell[N];. 
36a60 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43   return computeC
36a70 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d  ellSize(p, N);.}
36a80 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
36a90 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
36aa0 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c  pointers to nCel
36ab0 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65  l b-tree page ce
36ac0 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43  lls. The .** szC
36ad0 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  ell[] array cont
36ae0 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
36af0 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63   bytes of each c
36b00 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
36b10 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74  on.** replaces t
36b20 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
36b30 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20  nts of page pPg 
36b40 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
36b50 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s of the cell.**
36b60 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f   array..**.** So
36b70 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  me of the cells 
36b80 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20  in apCell[] may 
36b90 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
36ba0 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73  red in pPg. This
36bb0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  .** function wor
36bc0 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65  ks around proble
36bd0 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69  ms caused by thi
36be0 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f  s by making a co
36bf0 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75  py of any .** su
36c00 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  ch cells before 
36c10 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
36c20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  page data..**.**
36c30 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72   The MemPage.nFr
36c40 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61  ee field is inva
36c50 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
36c60 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
36c70 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
36c80 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
36c90 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63  ller to set it c
36ca0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
36cb0 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50  tic int rebuildP
36cc0 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
36cd0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
36ce0 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74         /* Edit t
36cf0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  his page */.  in
36d00 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
36d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d20 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Final number of
36d30 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a   cells on page *
36d40 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
36d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d60 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
36d70 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a  cells */.  u16 *
36d80 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  szCell          
36d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
36da0 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65  ray of cell size
36db0 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
36dc0 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68  int hdr = pPg->h
36dd0 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
36de0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
36df0 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f  header on pPg */
36e00 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
36e10 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
36e20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
36e30 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
36e40 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73  or pPg */.  cons
36e50 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65  t int usableSize
36e60 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61   = pPg->pBt->usa
36e70 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20  bleSize;.  u8 * 
36e80 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44  const pEnd = &aD
36e90 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b  ata[usableSize];
36ea0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a  .  int i;.  u8 *
36eb0 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e  pCellptr = pPg->
36ec0 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a  aCellIdx;.  u8 *
36ed0 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  pTmp = sqlite3Pa
36ee0 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67  gerTempSpace(pPg
36ef0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
36f00 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20    u8 *pData;..  
36f10 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  i = get2byte(&aD
36f20 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
36f30 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20  emcpy(&pTmp[i], 
36f40 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c  &aData[i], usabl
36f50 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70  eSize - i);..  p
36f60 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66  Data = pEnd;.  f
36f70 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
36f80 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
36f90 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d  Cell = apCell[i]
36fa0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
36fb0 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44  _WITHIN(pCell,aD
36fc0 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20  ata,pEnd) ){.   
36fd0 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70     pCell = &pTmp
36fe0 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b  [pCell - aData];
36ff0 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61  .    }.    pData
37000 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20   -= szCell[i];. 
37010 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
37020 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61  lptr, (pData - a
37030 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
37040 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69  lptr += 2;.    i
37050 66 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c  f( pData < pCell
37060 70 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ptr ) return SQL
37070 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
37080 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
37090 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  ta, pCell, szCel
370a0 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[i]);.    asser
370b0 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50  t( szCell[i]==pP
370c0 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
370d0 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  , pCell) || CORR
370e0 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65  UPT_DB );.    te
370f0 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69  stcase( szCell[i
37100 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a  ]!=pPg->xCellSiz
37110 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a  e(pPg,pCell) );.
37120 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50    }..  /* The pP
37130 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  g->nFree field i
37140 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72  s now set incorr
37150 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ectly. The calle
37160 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a  r will fix it. *
37170 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d  /.  pPg->nCell =
37180 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e   nCell;.  pPg->n
37190 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
371a0 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
371b0 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70  [hdr+1], 0);.  p
371c0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
371d0 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c  dr+3], pPg->nCel
371e0 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  l);.  put2byte(&
371f0 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44  aData[hdr+5], pD
37200 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20  ata - aData);.  
37210 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30  aData[hdr+7] = 0
37220 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x00;.  return SQ
37230 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
37240 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
37250 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
37260 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
37270 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
37280 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69  szCell.** contai
37290 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
372a0 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
372b0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
372c0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
372d0 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65  o .** add the ce
372e0 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lls stored in th
372f0 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20  e array to page 
37300 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f  pPg. If it canno
37310 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74  t (because .** t
37320 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
37330 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64   be defragmented
37340 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c   before the cell
37350 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e  s will fit), non
37360 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75  -zero.** is retu
37370 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
37380 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72   if the cells ar
37390 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  e added successf
373a0 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a  ully, zero is.**
373b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
373c0 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70   Argument pCellp
373d0 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  tr points to the
373e0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
373f0 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
37400 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20   array.** (part 
37410 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20  of page pPg) to 
37420 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20  populate. After 
37430 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69  cell apCell[0] i
37440 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
37450 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61  .** page body, a
37460 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69   16-bit offset i
37470 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65  s written to pCe
37480 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e  llptr. And so on
37490 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65  , for each.** ce
374a0 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ll in the array.
374b0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
374c0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
374d0 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
374e0 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  e.** that it is 
374f0 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74  safe to overwrit
37500 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  e this part of t
37510 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
37520 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  array..**.** Whe
37530 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
37540 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61  is called, *ppDa
37550 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ta points to the
37560 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a   start of the .*
37570 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f  * content area o
37580 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74  n page pPg. If t
37590 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  he size of the c
375a0 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65  ontent area is e
375b0 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44  xtended,.** *ppD
375c0 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74  ata is updated t
375d0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
375e0 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ew start of the 
375f0 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20  content area.** 
37600 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
37610 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  ..**.** Finally,
37620 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e   argument pBegin
37630 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
37640 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  yte immediately 
37650 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a  following the.**
37660 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63   end of the spac
37670 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  e required by th
37680 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  is page for the 
37690 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
376a0 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65  a (for.** all ce
376b0 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74  lls - not just t
376c0 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79  hose inserted by
376d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c   the current cal
376e0 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65  l). If the conte
376f0 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20  nt.** area must 
37700 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62  be extended to b
37710 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74  efore this point
37720 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63   in order to acc
37730 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63  omodate all.** c
37740 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
37750 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73  , then the cells
37760 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20   do not fit and 
37770 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
37780 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
37790 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72  int pageInsertAr
377a0 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
377b0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
377c0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
377d0 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a  o add cells to *
377e0 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20  /.  u8 *pBegin, 
377f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37800 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65      /* End of ce
37810 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
37820 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74   */.  u8 **ppDat
37830 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
37840 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
37850 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61   Page content -a
37860 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  rea pointer */. 
37870 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20   u8 *pCellptr,  
37880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37890 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
378a0 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
378b0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
378c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
378d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
378e0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
378f0 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  add */.  int nCe
37900 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37910 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37920 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
37930 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43  dd to pPg */.  C
37940 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61  ellArray *pCArra
37950 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y              /
37960 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
37970 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
37980 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50    u8 *aData = pP
37990 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
379a0 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b  pData = *ppData;
379b0 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46  .  int iEnd = iF
379c0 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20  irst + nCell;.  
379d0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
379e0 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66  DB || pPg->hdrOf
379f0 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  fset==0 );    /*
37a00 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e   Never called on
37a10 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72   page 1 */.  for
37a20 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e  (i=iFirst; i<iEn
37a30 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  d; i++){.    int
37a40 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20   sz, rc;.    u8 
37a50 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d  *pSlot;.    sz =
37a60 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28   cachedCellSize(
37a70 70 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20  pCArray, i);.   
37a80 20 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d   if( (aData[1]==
37a90 30 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30  0 && aData[2]==0
37aa0 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61  ) || (pSlot = pa
37ab0 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73  geFindSlot(pPg,s
37ac0 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20  z,&rc))==0 ){.  
37ad0 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b      pData -= sz;
37ae0 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
37af0 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e  <pBegin ) return
37b00 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20   1;.      pSlot 
37b10 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
37b20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e 64 20     /* pSlot and 
37b30 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
37b40 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  i] will never ov
37b50 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c 6c 2d  erlap on a well-
37b60 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20 64 61  formed.    ** da
37b70 74 61 62 61 73 65 2e 20 20 42 75 74 20 74 68 65  tabase.  But the
37b80 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20 63 6f  y might for a co
37b90 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20  rrupt database. 
37ba0 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d 6d 6f   Hence use memmo
37bb0 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69 6e 63  ve().    ** sinc
37bc0 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e 64 73  e memcpy() sends
37bd0 20 53 49 47 41 42 4f 52 54 20 77 69 74 68 20 6f   SIGABORT with o
37be0 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66 66 65  verlapping buffe
37bf0 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20 2a 2f  rs on OpenBSD */
37c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53  .    assert( (pS
37c10 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72 61 79  lot+sz)<=pCArray
37c20 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20 20 20  ->apCell[i].    
37c30 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d 28       || pSlot>=(
37c40 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
37c50 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20 20 20  i]+sz).         
37c60 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
37c70 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 53 6c  .    memmove(pSl
37c80 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61 70 43  ot, pCArray->apC
37c90 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  ell[i], sz);.   
37ca0 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
37cb0 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61  tr, (pSlot - aDa
37cc0 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
37cd0 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a  tr += 2;.  }.  *
37ce0 70 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  ppData = pData;.
37cf0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
37d00 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
37d10 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
37d20 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
37d30 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
37d40 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f  ay szCell .** co
37d50 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
37d60 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
37d70 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   such cell. This
37d80 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74   function adds t
37d90 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f  he.** space asso
37da0 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
37db0 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
37dc0 61 79 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ay that is curre
37dd0 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20  ntly stored .** 
37de0 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20  within the body 
37df0 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20 70 50  of pPg to the pP
37e00 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65  g free-list. The
37e10 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61   cell-pointers a
37e20 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c  nd other.** fiel
37e30 64 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  ds of the page a
37e40 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a  re not updated..
37e50 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
37e60 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
37e70 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
37e80 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74  cells added to t
37e90 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f  he free-list..*/
37ea0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
37eb0 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d  FreeArray(.  Mem
37ec0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
37ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37ee0 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a  Page to edit */.
37ef0 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20    int iFirst,   
37f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f10 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c 20    /* First cell 
37f20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
37f30 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
37f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37f50 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74  * Cells to delet
37f60 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79  e */.  CellArray
37f70 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20   *pCArray       
37f80 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
37f90 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  of cells */.){. 
37fa0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
37fb0 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
37fc0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e    u8 * const pEn
37fd0 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e  d = &aData[pPg->
37fe0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
37ff0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
38000 53 74 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70  Start = &aData[p
38010 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  Pg->hdrOffset + 
38020 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74  8 + pPg->childPt
38030 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52  rSize];.  int nR
38040 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  et = 0;.  int i;
38050 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46  .  int iEnd = iF
38060 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20  irst + nCell;.  
38070 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20  u8 *pFree = 0;. 
38080 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b   int szFree = 0;
38090 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74  ..  for(i=iFirst
380a0 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a  ; i<iEnd; i++){.
380b0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
380c0 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
380d0 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  i];.    if( SQLI
380e0 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c  TE_WITHIN(pCell,
380f0 20 70 53 74 61 72 74 2c 20 70 45 6e 64 29 20 29   pStart, pEnd) )
38100 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  {.      int sz;.
38110 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64        /* No need
38120 20 74 6f 20 75 73 65 20 63 61 63 68 65 64 43 65   to use cachedCe
38130 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e 20 20  llSize() here.  
38140 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c  The sizes of all
38150 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20 20 20   cells that.    
38160 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65 20 66    ** are to be f
38170 72 65 65 64 20 68 61 76 65 20 61 6c 72 65 61 64  reed have alread
38180 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67  y been computing
38190 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e 67 20   while deciding 
381a0 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 63  which.      ** c
381b0 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65 69 6e  ells need freein
381c0 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20  g */.      sz = 
381d0 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b  pCArray->szCell[
381e0 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73 7a 3e  i];  assert( sz>
381f0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
38200 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73  Free!=(pCell + s
38210 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z) ){.        if
38220 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( pFree ){.     
38230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
38240 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
38250 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
38260 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  6 );.          f
38270 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75  reeSpace(pPg, (u
38280 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74  16)(pFree - aDat
38290 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20  a), szFree);.   
382a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
382b0 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
382c0 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73        szFree = s
382d0 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  z;.        if( p
382e0 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72  Free+sz>pEnd ) r
382f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
38300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
38310 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
38320 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73       szFree += s
38330 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
38340 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRet++;.    }. 
38350 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29   }.  if( pFree )
38360 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
38370 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46  ree>aData && (pF
38380 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35  ree - aData)<655
38390 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70  36 );.    freeSp
383a0 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70  ace(pPg, (u16)(p
383b0 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73  Free - aData), s
383c0 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  zFree);.  }.  re
383d0 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn nRet;.}../*
383e0 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64  .** apCell[] and
383f0 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   szCell[] contai
38400 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
38410 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20  nd sizes of all 
38420 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cells in the.** 
38430 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61  pages being bala
38440 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72 72 65  nced.  The curre
38450 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61  nt page, pPg, ha
38460 73 20 70 50 67 2d 3e 6e 43