/ Hex Artifact Content
Login

Artifact 8e529f390d8d1d83acbaf13cb1c09da8361cf5b1:


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 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 30 35 20 32 30 30 37 2f 30  c,v 1.405 2007/0
0190: 38 2f 32 31 20 31 33 3a 31 31 3a 30 31 20 64 61  8/21 13:11:01 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
0390: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  ST.int sqlite3_b
03a0: 74 72 65 65 5f 74 72 61 63 65 3d 30 3b 20 20 2f  tree_trace=0;  /
03b0: 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65  * True to enable
03c0: 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 65 6e 64   tracing */.#end
03d0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
03e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
03f0: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 66 6c 61  ACHE./*.** A fla
0400: 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
0410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 68 61  ether or not sha
0420: 72 65 64 20 63 61 63 68 65 20 69 73 20 65 6e 61  red cache is ena
0430: 62 6c 65 64 2e 20 20 41 6c 73 6f 2c 0a 2a 2a 20  bled.  Also,.** 
0440: 61 20 6c 69 73 74 20 6f 66 20 42 74 53 68 61 72  a list of BtShar
0450: 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ed objects that 
0460: 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
0470: 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e 0a 2a   participation.*
0480: 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  * in shared cach
0490: 65 2e 20 20 54 68 65 20 76 61 72 69 61 62 6c 65  e.  The variable
04a0: 73 20 68 61 76 65 20 66 69 6c 65 20 73 63 6f 70  s have file scop
04b0: 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20  e during normal 
04c0: 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20 74  builds,.** but t
04d0: 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73 20  he test harness 
04e0: 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73 20  needs to access 
04f0: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
0500: 73 6f 20 6d 61 6b 65 20 74 68 65 6d 0a 2a 2a 20  so make them.** 
0510: 67 6c 6f 62 61 6c 20 66 6f 72 20 74 65 73 74 20  global for test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65  builds..*/.#ifde
0530: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0540: 53 68 61 72 65 64 20 2a 73 71 6c 69 74 65 33 53  Shared *sqlite3S
0550: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d  haredCacheList =
0560: 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 53   0;.int sqlite3S
0570: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0580: 64 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  d = 0;.#else.sta
0590: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 73 71  tic BtShared *sq
05a0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
05b0: 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  List = 0;.static
05c0: 20 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72   int sqlite3Shar
05d0: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
05e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69   0;.#endif.#endi
05f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
0600: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
0610: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0620: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0630: 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  HE./*.** Enable 
0640: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  or disable the s
0650: 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64 20  hared pager and 
0660: 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73 2e  schema features.
0670: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0680: 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65 63  ine has no effec
0690: 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64 61  t on existing da
06a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
06b0: 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65  ns..** The share
06c0: 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67 20  d cache setting 
06d0: 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75 74  effects only fut
06e0: 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ure calls to.** 
06f0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20  sqlite3_open(), 
0700: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
0710: 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65  , or sqlite3_ope
0720: 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  n_v2()..*/.int s
0730: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
0740: 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20 65  ared_cache(int e
0750: 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65  nable){.  sqlite
0760: 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  3SharedCacheEnab
0770: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0790: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
07a0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
07b0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
07c0: 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
07d0: 63 6b 73 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c  cks(Btree*,Pgno,
07e0: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 0a 23 69  BtCursor*);...#i
07f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0800: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
0810: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63  /*.  ** The func
0820: 74 69 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65  tions queryTable
0830: 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c  Lock(), lockTabl
0840: 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c  e() and unlockAl
0850: 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d  lTables().  ** m
0860: 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65  anipulate entrie
0870: 73 20 69 6e 20 74 68 65 20 42 74 53 68 61 72 65  s in the BtShare
0880: 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c  d.pLock linked l
0890: 69 73 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ist used to stor
08a0: 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61  e.  ** shared-ca
08b0: 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20  che table level 
08c0: 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69  locks. If the li
08d0: 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65  brary is compile
08e0: 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
08f0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
0900: 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74  ture disabled, t
0910: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  hen there is onl
0920: 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a  y ever one user.
0930: 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53    ** of each BtS
0940: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
0950: 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b  and so this lock
0960: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
0970: 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64  sary. .  ** So d
0980: 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72  efine the lock r
0990: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73  elated functions
09a0: 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f   as no-ops..  */
09b0: 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65 72 79  .  #define query
09c0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
09d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
09e0: 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61  fine lockTable(a
09f0: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
0a00: 20 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b    #define unlock
0a10: 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a 23 65 6e  AllTables(a).#en
0a20: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
0a30: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0a40: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72  CACHE./*.** Quer
0a50: 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65  y to see if btre
0a60: 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f  e handle p may o
0a70: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
0a80: 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28  type eLock .** (
0a90: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
0aa0: 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20  TE_LOCK) on the 
0ab0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
0ac0: 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72  page iTab. Retur
0ad0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  n.** SQLITE_OK i
0ae0: 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62  f the lock may b
0af0: 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63  e obtained (by c
0b00: 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65  alling lockTable
0b10: 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  ()), or.** SQLIT
0b20: 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e  E_LOCKED if not.
0b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71  .*/.static int q
0b40: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74  ueryTableLock(Bt
0b50: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
0b60: 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20  b, u8 eLock){.  
0b70: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
0b80: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
0b90: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
0ba0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
0bb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
0bc0: 78 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  x) );.  .  /* Th
0bd0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
0be0: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
0bf0: 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  e is not enabled
0c00: 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   */.  if( !p->sh
0c10: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65  arable ){.    re
0c20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0c30: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28    }..  /* This (
0c40: 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54  along with lockT
0c50: 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65  able()) is where
0c60: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0c70: 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a  tted flag is.  *
0c80: 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66  * dealt with. If
0c90: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71   the caller is q
0ca0: 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65  uerying for a re
0cb0: 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ad-lock and the 
0cc0: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74  flag is.  ** set
0cd0: 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74  , it is uncondit
0ce0: 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20  ionally granted 
0cf0: 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  - even if there 
0d00: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
0d10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
0d20: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
0d30: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
0d40: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0d50: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
0d60: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
0d70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
0d80: 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c  unction lockTabl
0d90: 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c  e(), if a read-l
0da0: 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20  ock is demanded 
0db0: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65  and the .  ** Re
0dc0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0dd0: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e  ag is set, no en
0de0: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
0df0: 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a  the locks list .
0e00: 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70    ** (BtShared.p
0e10: 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Lock)..  **.  **
0e20: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49   To summarize: I
0e30: 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  f the ReadUncomm
0e40: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0e50: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72  t, then read cur
0e60: 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  sors do.  ** not
0e70: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
0e80: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
0e90: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63  The locking proc
0ea0: 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a  edure for a .  *
0eb0: 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64  * write-cursor d
0ec0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a  oes not change..
0ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
0ee0: 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a  !p->pSqlite || .
0ef0: 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69      0==(p->pSqli
0f00: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
0f10: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
0f20: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
0f30: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
0f40: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
0f50: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
0f60: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
0f70: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
0f80: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
0f90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
0fa0: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
0fb0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
0fc0: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
0fd0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
0fe0: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
0ff0: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
1000: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1010: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
1020: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1040: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
1050: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1060: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1080: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1090: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
10a0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
10b0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
10c0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
10d0: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
10e0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
10f0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
1100: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
1110: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
1120: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
1130: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1140: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
1150: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
1160: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
1170: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c  _BUSY and.** SQL
1180: 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c  ITE_NOMEM may al
1190: 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  so be returned..
11a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
11b0: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
11c0: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
11d0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
11e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11f0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
1200: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
1210: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
1220: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1230: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1240: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ex) );..  /* Thi
1250: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1260: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1270: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1280: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1290: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
12a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12b0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
12c0: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61  LITE_OK==queryTa
12d0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
12e0: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
12f0: 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75  /* If the read-u
1300: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1310: 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61  is set and a rea
1320: 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  d-lock is reques
1330: 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ted,.  ** return
1340: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61   early without a
1350: 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74  dding an entry t
1360: 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  o the BtShared.p
1370: 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20  Lock list. See. 
1380: 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66   ** comment in f
1390: 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62  unction queryTab
13a0: 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72  leLock() for mor
13b0: 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69  e info on handli
13c0: 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61  ng .  ** the Rea
13d0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
13e0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
13f0: 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 29 20     (p->pSqlite) 
1400: 26 26 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c  && .    (p->pSql
1410: 69 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  ite->flags&SQLIT
1420: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
1430: 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63  d) && .    (eLoc
1440: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26  k==READ_LOCK) &&
1450: 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53  .    iTable!=MAS
1460: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
1470: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1480: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  OK;.  }..  /* Fi
1490: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
14a0: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
14b0: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
14c0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
14d0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
14e0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
14f0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1500: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
1510: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
1520: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
1530: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
1540: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
1550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1560: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
1570: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
1580: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
1590: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
15a0: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
15b0: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
15c0: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
15d0: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
15e0: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
15f0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
1600: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
1610: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
1620: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
1630: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
1640: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
1650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1660: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1670: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20  pLock->iTable = 
1680: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63  iTable;.    pLoc
1690: 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  k->pBtree = p;. 
16a0: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
16b0: 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
16c0: 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70    pBt->pLock = p
16d0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Lock;.  }..  /* 
16e0: 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65  Set the BtLock.e
16f0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
1700: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
1710: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
1720: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
1730: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68  quested lock. Th
1740: 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72  is means if a wr
1750: 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72  ite-lock was alr
1760: 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61  eady held.  ** a
1770: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72  nd a read-lock r
1780: 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e  equested, we don
1790: 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64  't incorrectly d
17a0: 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63  owngrade the loc
17b0: 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  k..  */.  assert
17c0: 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41  ( WRITE_LOCK>REA
17d0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
17e0: 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f  eLock>pLock->eLo
17f0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  ck ){.    pLock-
1800: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
1810: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1820: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1830: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
1840: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
1850: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1860: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1870: 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  CHE./*.** Releas
1880: 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20  e all the table 
1890: 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74  locks (locks obt
18a0: 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20  ained via calls 
18b0: 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65  to the lockTable
18c0: 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29  ().** procedure)
18d0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68   held by Btree h
18e0: 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74  andle p..*/.stat
18f0: 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c  ic void unlockAl
1900: 6c 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70  lTables(Btree *p
1910: 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70  ){.  BtLock **pp
1920: 49 74 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e  Iter = &p->pBt->
1930: 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74  pLock;..  assert
1940: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1950: 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
1960: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1970: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20   p->sharable || 
1980: 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20  0==*ppIter );.. 
1990: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
19a0: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
19b0: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
19c0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19d0: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
19e0: 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63    *ppIter = pLoc
19f0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
1a00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
1a10: 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
1a20: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
1a30: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
1a40: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1a50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1a60: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
1a70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
1a80: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
1a90: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
1aa0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1ab0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1ac0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1ad0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
1ae0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1af0: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
1b00: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
1b10: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
1b20: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
1b30: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
1b40: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1b50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1b60: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
1b70: 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  .  pCur->aOverfl
1b80: 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ow = 0;.}../*.**
1b90: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
1ba0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1bb0: 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c  st cache for all
1bc0: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
1bd0: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
1be0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
1bf0: 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pBt..*/.static 
1c00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41  void invalidateA
1c10: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1c20: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1c30: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1c40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1c60: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
1c70: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
1c80: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1c90: 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
1ca0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b  verflowCache(p);
1cb0: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
1cc0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
1cd0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78  eOverflowCache(x
1ce0: 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  ).  #define inva
1cf0: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1d00: 77 43 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66  wCache(x).#endif
1d10: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
1d20: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1d30: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
1d40: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
1d50: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
1d60: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
1d70: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
1d80: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
1d90: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
1da0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
1db0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
1dc0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1dd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1de0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
1df0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1e00: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
1e10: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
1e20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1e40: 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  r->pBtree->pBt->
1e50: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 72 63 20  mutex) );..  rc 
1e60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
1e70: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
1e80: 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20  r->nKey);..  /* 
1e90: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
1ea0: 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  tKey table, then
1eb0: 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20   the above call 
1ec0: 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28  to BtreeKeySize(
1ed0: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
1ee0: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e  e integer key in
1ef0: 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20   pCur->nKey. In 
1f00: 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76  this case this v
1f10: 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c  alue is.  ** all
1f20: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
1f30: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1f40: 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65   pCur is not ope
1f50: 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20  n on an intKey. 
1f60: 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20   ** table, then 
1f70: 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72  malloc space for
1f80: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70   and store the p
1f90: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
1fa0: 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74  of key .  ** dat
1fb0: 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  a..  */.  if( rc
1fc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
1fd0: 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ==pCur->pPage->i
1fe0: 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64  ntKey){.    void
1ff0: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
2000: 5f 6d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b  _malloc(pCur->nK
2010: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ey);.    if( pKe
2020: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
2030: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
2040: 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e  pCur, 0, pCur->n
2050: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
2060: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2070: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2080: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
2090: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
20b0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
20c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
20d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
20f0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
2100: 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
2110: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
2120: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2130: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2140: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
2150: 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72  pPage);.    pCur
2160: 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->pPage = 0;.   
2170: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2180: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2190: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
21a0: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
21b0: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
21c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21d0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
21e0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
21f0: 73 20 65 78 63 65 70 74 20 70 45 78 63 65 70 74  s except pExcept
2200: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62   open on the tab
2210: 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74  le .** with root
2220: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75  -page iRoot. Usu
2230: 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61  ally, this is ca
2240: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
2250: 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65   cursor.** pExce
2260: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
2270: 64 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 28  dify the table (
2280: 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2290: 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e   BtreeInsert()).
22a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
22b0: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
22c0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
22d0: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
22e0: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
22f0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
2300: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2310: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2320: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
2330: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
2340: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
2350: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
2360: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
2370: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
2380: 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20  oot) && .       
2390: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
23a0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
23b0: 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43    int rc = saveC
23c0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
23d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
23e0: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
23f0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2400: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2410: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2420: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
2430: 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74  lear the current
2440: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2460: 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
2470: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
2480: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
2490: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24a0: 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
24b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
24c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24d0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
24e0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
24f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2500: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
2510: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
2520: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2530: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
2540: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
2550: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
2560: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
2570: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
2580: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
2590: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
25a0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
25b0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
25c0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
25d0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
25e0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
25f0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
2600: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
2610: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2620: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
2630: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
2640: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
2650: 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  n()..**.** If th
2660: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2670: 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53  t argument - doS
2680: 65 65 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20  eek - is false, 
2690: 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  then instead of 
26a0: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68  .** returning th
26b0: 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73  e cursor to it's
26c0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c   saved position,
26d0: 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74   any saved posit
26e0: 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a  ion is deleted.*
26f0: 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  * and the cursor
2700: 20 73 74 61 74 65 20 73 65 74 20 74 6f 20 43 55   state set to CU
2710: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f  RSOR_INVALID..*/
2720: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2730: 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43  eRestoreOrClearC
2740: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2750: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2760: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
2770: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2780: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
2790: 45 45 4b 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  EEK );.#ifndef S
27a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
27b0: 4c 4f 42 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  LOB.  if( pCur->
27c0: 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
27d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27e0: 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
27f0: 0a 23 65 6e 64 69 66 0a 20 20 70 43 75 72 2d 3e  .#endif.  pCur->
2800: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2810: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
2820: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2830: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
2840: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
2850: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29   0, &pCur->skip)
2860: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2870: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2880: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
2890: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
28a0: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
28b0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28d0: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
28e0: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
28f0: 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  D );.  }.  retur
2900: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
2910: 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2920: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
2930: 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3d   \.  (p->eState=
2940: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
2950: 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20  EEK ? \.        
2960: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73   sqlite3BtreeRes
2970: 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2980: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
2990: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
29a0: 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53 51  _OK)..#ifndef SQ
29b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
29c0: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
29d0: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
29e0: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
29f0: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
2a00: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
2a10: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
2a20: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
2a30: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2a40: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
2a50: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
2a60: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  er..*/.static Pg
2a70: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
2a80: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
2a90: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
2aa0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
2ab0: 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  e, iPtrMap, ret;
2ac0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ad0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2ae0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
2af0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
2b00: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
2b10: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
2b20: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
2b30: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
2b40: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
2b50: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
2b60: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
2b70: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
2b80: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2b90: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
2ba0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
2bb0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
2bc0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
2bd0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
2be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
2bf0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
2c00: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
2c10: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
2c20: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
2c30: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
2c40: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
2c50: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
2c60: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
2c70: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
2c80: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
2c90: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
2ca0: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
2cb0: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2cc0: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
2cd0: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
2ce0: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
2cf0: 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  ent){.  DbPage *
2d00: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
2d10: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
2d20: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
2d30: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
2d40: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
2d50: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
2d60: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
2d70: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
2d80: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
2d90: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
2da0: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
2db0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
2dc0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2dd0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2de0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2df0: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
2e00: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
2e10: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
2e20: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
2e30: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
2e40: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
2e50: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
2e60: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
2e70: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
2e80: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
2e90: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
2ea0: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
2eb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ec0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ed0: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
2ee0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
2ef0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
2f00: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2f10: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
2f20: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
2f30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
2f50: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
2f60: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
2f70: 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b  FFSET(pBt, key);
2f80: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
2f90: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
2fa0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
2fb0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
2fc0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
2fd0: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
2fe0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
2ff0: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
3000: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
3010: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
3020: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
3030: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72   parent));.    r
3040: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
3050: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
3060: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
3070: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
3080: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
3090: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
30a0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
30b0: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
30c0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
30d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
30e0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72  ef(pDbPage);.  r
30f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3100: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
3110: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
3120: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
3130: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
3140: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
3150: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
3160: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
3170: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
3180: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
3190: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
31a0: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
31b0: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
31c0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31d0: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
31e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
31f0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
3200: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
3210: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
3220: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
3230: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
3240: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
3250: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
3260: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
3270: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
3280: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
3290: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
32a0: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
32b0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
32c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
32d0: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
32e0: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
32f0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
3300: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
3310: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
3320: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3330: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3340: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
3350: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
3360: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
3370: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
3380: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
3390: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
33a0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
33b0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
33c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
33d0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
33e0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
33f0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
3400: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
3410: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
3420: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73  pBt, key);.  ass
3430: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
3440: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
3450: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
3460: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
3470: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
3480: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
3490: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
34a0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
34b0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
34c0: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
34d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
34e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3500: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
3510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
3520: 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
3530: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
3540: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
3550: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
3560: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
3570: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
3580: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
3590: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
35a0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
35b0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
35c0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
35d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
35e0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
35f0: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
3600: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
3610: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
3620: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  ne findCell(pPag
3630: 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28 28  e, iCell) \.  ((
3640: 70 50 61 67 65 29 2d 3e 61 44 61 74 61 20 2b 20  pPage)->aData + 
3650: 67 65 74 32 62 79 74 65 28 26 28 70 50 61 67 65  get2byte(&(pPage
3660: 29 2d 3e 61 44 61 74 61 5b 28 70 50 61 67 65 29  )->aData[(pPage)
3670: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28  ->cellOffset+2*(
3680: 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66 64 65 66  iCell)])).#ifdef
3690: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 75 38 20   SQLITE_TEST.u8 
36a0: 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e  *sqlite3BtreeFin
36b0: 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  dCell(MemPage *p
36c0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
36d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c  {.  assert( iCel
36e0: 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l>=0 );.  assert
36f0: 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79 74 65  ( iCell<get2byte
3700: 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
3710: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
3720: 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  3]) );.  return 
3730: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
3740: 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  iCell);.}.#endif
3750: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
3760: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
3770: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ion of sqlite3Bt
3780: 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20 74 68  reeFindCell() th
3790: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
37a0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f  pages that do co
37b0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
37c0: 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72  ells.  See inser
37d0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  t.*/.static u8 *
37e0: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
37f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
3800: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69   int iCell){.  i
3810: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
3820: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3830: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
3840: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
3850: 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  =pPage->nOverflo
3860: 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  w-1; i>=0; i--){
3870: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
3880: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
3890: 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76   *pOvfl;.    pOv
38a0: 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76  fl = &pPage->aOv
38b0: 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70  fl[i];.    k = p
38c0: 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69  Ovfl->idx;.    i
38d0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
38e0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
38f0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
3900: 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c  urn pOvfl->pCell
3910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3920: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
3930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
3940: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
3950: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
3960: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
3970: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
3980: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
3990: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
39a0: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
39b0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
39c0: 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65  unction.  sqlite
39d0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
39e0: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
39f0: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
3a00: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
3a10: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
3a20: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a  ParseCellPtr() .
3a30: 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  ** takes a point
3a40: 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  er to the body o
3a50: 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74  f the cell as it
3a60: 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  s second argumen
3a70: 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  t..**.** Within 
3a80: 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70  this file, the p
3a90: 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f  arseCell() macro
3aa0: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69   can be called i
3ab0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c  nstead of.** sql
3ac0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3ad0: 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73  llPtr(). Using s
3ae0: 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74  ome compilers, t
3af0: 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74  his will be fast
3b00: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
3b10: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3b20: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
3b30: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
3b40: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
3b50: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
3b60: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
3b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
3b80: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
3b90: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
3ba0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
3bb0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
3bc0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3bd0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  ){.  int n;     
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3bf0: 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20  Number bytes in 
3c00: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61  cell content hea
3c10: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  der */.  u32 nPa
3c20: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
3c30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
3c40: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
3c50: 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  oad */..  assert
3c60: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3c70: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
3c80: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49  >mutex) );..  pI
3c90: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
3ca0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
3cb0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
3cc0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
3cd0: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
3ce0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
3cf0: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
3d00: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
3d10: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
3d20: 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  a ){.    n += ge
3d30: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
3d40: 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b  [n], &nPayload);
3d50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
3d60: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a  ayload = 0;.  }.
3d70: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
3d80: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28   nPayload;.  if(
3d90: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
3da0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  {.    n += getVa
3db0: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
3dc0: 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e  (u64 *)&pInfo->n
3dd0: 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
3de0: 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20     u32 x;.    n 
3df0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
3e00: 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20  pCell[n], &x);. 
3e10: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
3e20: 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   x;.    nPayload
3e30: 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e   += x;.  }.  pIn
3e40: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
3e50: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
3e60: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
3e70: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
3e80: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
3e90: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
3ea0: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
3eb0: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
3ec0: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
3ed0: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
3ee0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
3ef0: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
3f00: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
3f10: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
3f30: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
3f40: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
3f50: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  */.    pInfo->nL
3f60: 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  ocal = nPayload;
3f70: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
3f80: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e  rflow = 0;.    n
3f90: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
3fa0: 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  + n;.    if( nSi
3fb0: 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53  ze<4 ){.      nS
3fc0: 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20  ize = 4;        
3fd0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
3fe0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20  size is 4 */.   
3ff0: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53   }.    pInfo->nS
4000: 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d  ize = nSize;.  }
4010: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
4020: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
4030: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
4040: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
4050: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
4060: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
4070: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
4080: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
4090: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
40a0: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
40b0: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
40c0: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
40d0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
40e0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
40f0: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
4100: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
4110: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
4120: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
4130: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
4140: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
4150: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
4160: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
4170: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
4180: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
4190: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
41a0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
41b0: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
41c0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
41d0: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
41e0: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
41f0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
4200: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
4210: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
4220: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
4230: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
4240: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
4250: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
4260: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
4270: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
4280: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
4290: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
42a0: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
42b0: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
42c0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
42d0: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
42e0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
42f0: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
4300: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
4310: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
4320: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
4330: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
4340: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
4350: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
4360: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
4370: 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a  ocal = surplus;.
4380: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4390: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
43a0: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
43b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
43c0: 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e  rflow = pInfo->n
43d0: 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70  Local + n;.    p
43e0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
43f0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
4400: 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e   4;.  }.}.#defin
4410: 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67  e parseCell(pPag
4420: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
4430: 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   \.  sqlite3Btre
4440: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
4450: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
4460: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
4470: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64  ), (pInfo)).void
4480: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4490: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
44a0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
44b0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
44c0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
44d0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
44e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
44f0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
4500: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
4510: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
4520: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
4530: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
4540: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
4550: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
4560: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
4570: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
4580: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
4590: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
45a0: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
45b0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
45c0: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
45d0: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
45e0: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
45f0: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
4600: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
4610: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
4620: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
4630: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
4640: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
4650: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
4660: 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nter..*/.#ifndef
4670: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69   NDEBUG.static i
4680: 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  nt cellSize(MemP
4690: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
46a0: 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  iCell){.  CellIn
46b0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  fo info;.  sqlit
46c0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
46d0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26  (pPage, iCell, &
46e0: 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  info);.  return 
46f0: 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65  info.nSize;.}.#e
4700: 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
4710: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
4720: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
4730: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
4740: 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  fo info;.  sqlit
4750: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
4760: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
4770: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
4780: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
4790: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
47a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
47b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
47c0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
47d0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
47e0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
47f0: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
4800: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
4810: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
4820: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
4830: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
4840: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4850: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
4860: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
4870: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
4880: 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b  {.  if( pCell ){
4890: 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
48a0: 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  fo;.    sqlite3B
48b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
48c0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
48d0: 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
48e0: 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
48f0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
4900: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
4910: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
4920: 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
4930: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
4940: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
4950: 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
4960: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
4970: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
4980: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
4990: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
49a0: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
49b0: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
49c0: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
49d0: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  ge->pgno);.    }
49e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
49f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a  LITE_OK;.}./*.**
4a00: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74   If the cell wit
4a10: 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e  h index iCell on
4a20: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
4a30: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
4a40: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
4a50: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
4a60: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
4a70: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
4a80: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
4a90: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
4aa0: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
4ab0: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
4ac0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
4ad0: 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73  u8 *pCell;.  ass
4ae0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4af0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
4b00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4b10: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72  pCell = findOver
4b20: 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20  flowCell(pPage, 
4b30: 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  iCell);.  return
4b40: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
4b50: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
4b60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
4b70: 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65  * Defragment the
4b80: 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c   page given.  Al
4b90: 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65  l Cells are move
4ba0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  d to the.** end 
4bb0: 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  of the page and 
4bc0: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69  all free space i
4bd0: 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  s collected into
4be0: 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65   one.** big Free
4bf0: 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20  Blk that occurs 
4c00: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68  in between the h
4c10: 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a  eader and cell.*
4c20: 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  * pointer array 
4c30: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
4c40: 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74  tent area..*/.st
4c50: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
4c60: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
4c70: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
4c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c90: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
4ca0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
4cb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4cc0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
4cd0: 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20   of a i-th cell 
4ce0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20  */.  int addr;  
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
4d10: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65  st byte after ce
4d20: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
4d30: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
4d60: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
4d70: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
4da0: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
4db0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4dc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
4dd0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
4de0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
4df0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
4e00: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
4e10: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
4e20: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
4e30: 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20   brk;           
4e40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
4e50: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
4e60: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
4e70: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
4e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4e90: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
4ea0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
4eb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
4ec0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
4ed0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
4ee0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
4ef0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
4f00: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
4f10: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
4f20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
4f30: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
4f40: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
4f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
4f60: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
4f70: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
4f80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
4f90: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
4fa0: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
4fb0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
4fc0: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
4fd0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
4fe0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
4ff0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
5000: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  emp = sqlite3_ma
5010: 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70 42 74  lloc( pPage->pBt
5020: 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
5030: 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20 72 65  if( temp==0 ) re
5040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5050: 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  M;.  data = pPag
5060: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
5070: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
5080: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
5090: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
50a0: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
50b0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
50c0: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
50d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
50e0: 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c  r+3]) );.  usabl
50f0: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
5100: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
5110: 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65    brk = get2byte
5120: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
5130: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 62    memcpy(&temp[b
5140: 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c  rk], &data[brk],
5150: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62 72   usableSize - br
5160: 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61 62  k);.  brk = usab
5170: 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d  leSize;.  for(i=
5180: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
5190: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
51a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
51b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
51c0: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
51d0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
51e0: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
51f0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
5200: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c 70      assert( pc<p
5210: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
5220: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a  eSize );.    siz
5230: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  e = cellSizePtr(
5240: 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d  pPage, &temp[pc]
5250: 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73 69  );.    brk -= si
5260: 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ze;.    memcpy(&
5270: 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70  data[brk], &temp
5280: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
5290: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
52a0: 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73   brk);.  }.  ass
52b0: 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66  ert( brk>=cellOf
52c0: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a  fset+2*nCell );.
52d0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
52e0: 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20  [hdr+5], brk);. 
52f0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
5300: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
5310: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
5320: 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d  7] = 0;.  addr =
5330: 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43   cellOffset+2*nC
5340: 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ell;.  memset(&d
5350: 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72  ata[addr], 0, br
5360: 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  k-addr);.  sqlit
5370: 65 33 5f 66 72 65 65 28 74 65 6d 70 29 3b 0a 20  e3_free(temp);. 
5380: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5390: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
53a0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
53b0: 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20 70   of space on a p
53c0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  age..**.** Retur
53d0: 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  n the index into
53e0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
53f0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
5400: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  e of.** the new 
5410: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20 72  allocation. Or r
5420: 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65  eturn 0 if there
5430: 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66   is not enough f
5440: 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e 20  ree.** space on 
5450: 74 68 65 20 70 61 67 65 20 74 6f 20 73 61 74 69  the page to sati
5460: 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  sfy the allocati
5470: 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a  on request..**.*
5480: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f  * If the page co
5490: 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66  ntains nBytes of
54a0: 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20   free space but 
54b0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
54c0: 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f  .** nBytes of co
54d0: 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70  ntiguous free sp
54e0: 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ace, then this r
54f0: 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63  outine automatic
5500: 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65  ally.** calls de
5510: 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20  fragementPage() 
5520: 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61  to consolidate a
5530: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65  ll free space be
5540: 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  fore .** allocat
5550: 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e  ing the new chun
5560: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
5570: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
5580: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5590: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74  nt nByte){.  int
55a0: 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a   addr, pc, hdr;.
55b0: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e    int size;.  in
55c0: 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74  t nFrag;.  int t
55d0: 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  op;.  int nCell;
55e0: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
55f0: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
5600: 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64  ar *data;.  .  d
5610: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
5620: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ta;.  assert( sq
5630: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
5640: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
5650: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
5660: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
5670: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5680: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
5690: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
56a0: 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c   );.  if( nByte<
56b0: 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20  4 ) nByte = 4;. 
56c0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46 72 65   if( pPage->nFre
56d0: 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61 67 65  e<nByte || pPage
56e0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 20  ->nOverflow>0 ) 
56f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 61 67  return 0;.  pPag
5700: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  e->nFree -= nByt
5710: 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  e;.  hdr = pPage
5720: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20  ->hdrOffset;..  
5730: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
5740: 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  +7];.  if( nFrag
5750: 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  <60 ){.    /* Se
5760: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
5770: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
5780: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
5790: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20  to satisfy the. 
57a0: 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75     ** space requ
57b0: 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72  est. */.    addr
57c0: 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68   = hdr+1;.    wh
57d0: 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32 62  ile( (pc = get2b
57e0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
57f0: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a  )>0 ){.      siz
5800: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
5810: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
5820: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
5830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5840: 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a  size<nByte+4 ){.
5850: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
5860: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
5870: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
5880: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
5890: 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a  7] = nFrag + siz
58a0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
58b0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a       return pc;.
58c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
58d0: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
58e0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73  e(&data[pc+2], s
58f0: 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20  ize-nByte);.    
5900: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
5910: 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  + size - nByte;.
5920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5930: 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  }.      addr = p
5940: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
5950: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
5960: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
5970: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
5980: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
5990: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
59a0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
59b0: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  ..  */.  top = g
59c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
59d0: 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d  r+5]);.  nCell =
59e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
59f0: 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f  hdr+3]);.  cellO
5a00: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
5a10: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  ellOffset;.  if(
5a20: 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65   nFrag>=60 || ce
5a30: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
5a40: 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65  ll > top - nByte
5a50: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 66 72   ){.    if( defr
5a60: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
5a70: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
5a80: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
5a90: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
5aa0: 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79    }.  top -= nBy
5ab0: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 65  te;.  assert( ce
5ac0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
5ad0: 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 70  ll <= top );.  p
5ae0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
5af0: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72 65  r+5], top);.  re
5b00: 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn top;.}../*.
5b10: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
5b20: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
5b30: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
5b40: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
5b50: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
5b60: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
5b70: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b   is pPage->aDisk
5b80: 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  [start].** and t
5b90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
5ba0: 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62  lock is "size" b
5bb0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
5bc0: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
5bd0: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
5be0: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
5bf0: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
5c00: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
5c10: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
5c20: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
5c30: 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  d freeSpace(MemP
5c40: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
5c50: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
5c60: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
5c70: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73  egin, hdr;.  uns
5c80: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
5c90: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
5ca0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
5cb0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
5cc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
5cd0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
5ce0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
5cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
5d00: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
5d10: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
5d20: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
5d30: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
5d40: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
5d50: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
5d60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5d70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
5d80: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
5d90: 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29  ;.  if( size<4 )
5da0: 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64   size = 4;..#ifd
5db0: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
5dc0: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
5dd0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
5de0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
5df0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
5e00: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
5e10: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
5e20: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
5e30: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
5e40: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
5e50: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
5e60: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
5e70: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
5e80: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
5e90: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
5ea0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
5eb0: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
5ec0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
5ed0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
5ee0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
5ef0: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
5f00: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
5f10: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
5f20: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5f30: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73  Size-4 );.    as
5f40: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
5f50: 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  r );.    addr = 
5f60: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73  pbegin;.  }.  as
5f70: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
5f80: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5f90: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65  Size-4 );.  asse
5fa0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
5fb0: 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a  || pbegin==0 );.
5fc0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5fd0: 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a  [addr], start);.
5fe0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5ff0: 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29  [start], pbegin)
6000: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
6010: 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a  ta[start+2], siz
6020: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
6030: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f  ee += size;..  /
6040: 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63  * Coalesce adjac
6050: 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  ent free blocks 
6060: 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67  */.  addr = pPag
6070: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31  e->hdrOffset + 1
6080: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
6090: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
60a0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
60b0: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
60c0: 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  psize;.    asser
60d0: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
60e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
60f0: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
6100: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
6110: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
6120: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
6130: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
6140: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6150: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
6160: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
6170: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
6180: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
6190: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
61a0: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
61b0: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61  +psize);.      a
61c0: 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74  ssert( frag<=dat
61d0: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
61e0: 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64  et+7] );.      d
61f0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
6200: 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b  fset+7] -= frag;
6210: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
6220: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67  &data[pbegin], g
6230: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
6240: 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75  ext]));.      pu
6250: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
6260: 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65  gin+2], pnext+ge
6270: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
6280: 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a  xt+2])-pbegin);.
6290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
62a0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
62b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
62c0: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
62d0: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
62e0: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
62f0: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
6300: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
6310: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
6320: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
6330: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
6340: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
6350: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
6360: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
6370: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
6380: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
6390: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
63a0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
63b0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
63c0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
63d0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67  [hdr+5], top + g
63e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
63f0: 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d  egin+2]));.  }.}
6400: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
6410: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
6420: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
6430: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
6440: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
6450: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
6460: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
6470: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
6480: 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ingly..*/.static
6490: 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61 67   void decodeFlag
64a0: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
64b0: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
64c0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
64d0: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
64e0: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
64f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
6500: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
6510: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
6520: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
6530: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6540: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
6550: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6560: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
6570: 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50 54   (flagByte & (PT
6580: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
6590: 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50  FDATA))!=0;.  pP
65a0: 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20  age->zeroData = 
65b0: 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f  (flagByte & PTF_
65c0: 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20  ZERODATA)!=0;.  
65d0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 66  pPage->leaf = (f
65e0: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
65f0: 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  AF)!=0;.  pPage-
6600: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
6610: 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  4*(pPage->leaf==
6620: 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  0);.  pBt = pPag
6630: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
6640: 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41  agByte & PTF_LEA
6650: 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  FDATA ){.    pPa
6660: 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 31  ge->leafData = 1
6670: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
6680: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
6690: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
66a0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
66b0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
66c0: 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c 65  e{.    pPage->le
66d0: 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  afData = 0;.    
66e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
66f0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
6700: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
6710: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
6720: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ocal;.  }.  pPag
6730: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70  e->hasData = !(p
6740: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c  Page->zeroData |
6750: 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  | (!pPage->leaf 
6760: 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  && pPage->leafDa
6770: 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ta));.}../*.** I
6780: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
6790: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
67a0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
67b0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lock..**.** The 
67c0: 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
67d0: 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  r must be a poin
67e0: 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
67f0: 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 74  ge which.** is t
6800: 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65  he parent of the
6810: 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69 74   page being init
6820: 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 6f  ialized.  The ro
6830: 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65  ot of a.** BTree
6840: 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20 61   has no parent a
6850: 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20 70  nd so for that p
6860: 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55  age, pParent==NU
6870: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LL..**.** Return
6880: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
6890: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
68a0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
68b0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
68c0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
68d0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
68e0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
68f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
6900: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
6910: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
6920: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
6930: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
6940: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
6950: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
6960: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
6970: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
6980: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
6990: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
69a0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20 20  treeInitPage(.  
69b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
69c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
69d0: 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  ge to be initial
69e0: 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ized */.  MemPag
69f0: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20  e *pParent      
6a00: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20   /* The parent. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20  /.){.  int pc;  
6a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6a40: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
6a50: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
6a60: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  ->aData[] */.  i
6a70: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
6a80: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
6a90: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
6aa0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20   header */.  u8 
6ab0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
6ac0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
6ad0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74  e->aData */.  Bt
6ae0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
6af0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
6b00: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
6b10: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
6b20: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
6b30: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
6b40: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
6b50: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
6b60: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
6b70: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
6b80: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
6b90: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
6ba0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
6bb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
6bc0: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
6bd0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  he page */.  int
6be0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
6bf0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
6c00: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6c10: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74  t area */..  pBt
6c20: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
6c30: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
6c40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6c50: 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65  rent==0 || pPare
6c60: 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  nt->pBt==pBt );.
6c70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6c80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6c90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
6ca0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
6cb0: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
6cc0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
6cd0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
6ce0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
6cf0: 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e  ata == &((unsign
6d00: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b  ed char*)pPage)[
6d10: 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  -pBt->pageSize] 
6d20: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
6d30: 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74  pParent!=pParent
6d40: 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72   && (pPage->pPar
6d50: 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d  ent!=0 || pPage-
6d60: 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20  >isInit) ){.    
6d70: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61  /* The parent pa
6d80: 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
6d90: 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68  change unless th
6da0: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
6db0: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
6dc0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6dd0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
6de0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72  Page->isInit ) r
6df0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6e00: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
6e10: 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  arent==0 && pPar
6e20: 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50  ent!=0 ){.    pP
6e30: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  age->pParent = p
6e40: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
6e50: 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
6e60: 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
6e70: 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65   }.  hdr = pPage
6e80: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64  ->hdrOffset;.  d
6e90: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
6ea0: 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  ta;.  decodeFlag
6eb0: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
6ec0: 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  r]);.  pPage->nO
6ed0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70  verflow = 0;.  p
6ee0: 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
6ef0: 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   0;.  usableSize
6f00: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
6f10: 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  ze;.  pPage->cel
6f20: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
6f30: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
6f40: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
6f50: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
6f60: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
6f70: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
6f80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6f90: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
6fa0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
6fb0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
6fc0: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
6fd0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
6fe0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
6ff0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
7000: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
7010: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7020: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
7030: 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  e->nCell==0 && p
7040: 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61  Parent!=0 && pPa
7050: 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  rent->pgno!=1 ){
7060: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65  .    /* All page
7070: 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c  s must have at l
7080: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65  east one cell, e
7090: 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70  xcept for root p
70a0: 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ages */.    retu
70b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
70c0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
70d0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
70e0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
70f0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
7100: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
7110: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e  ata[hdr+1]);.  n
7120: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
7130: 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c  7] + top - (cell
7140: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
7150: 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c  ->nCell);.  whil
7160: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69  e( pc>0 ){.    i
7170: 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  nt next, size;. 
7180: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
7190: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
71a0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
71b0: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
71c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
71d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
71e0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65  T; .    }.    ne
71f0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
7200: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69  ata[pc]);.    si
7210: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
7220: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
7230: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
7240: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
7250: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
7260: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
7270: 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
7280: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7290: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
72a0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
72b0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
72c0: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
72d0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
72e0: 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28  e = nFree;.  if(
72f0: 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69   nFree>=usableSi
7300: 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65  ze ){.    /* Fre
7310: 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65  e space cannot e
7320: 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65  xceed total page
7330: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74   size */.    ret
7340: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7350: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
7360: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
7370: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
7380: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7390: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
73a0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
73b0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
73c0: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
73d0: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
73e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
73f0: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
7400: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
7410: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
7420: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
7430: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
7440: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
7450: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64  e->pBt;.  int hd
7460: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
7470: 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73  fset;.  int firs
7480: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
7490: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
74a0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
74b0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
74c0: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  o );.  assert( &
74d0: 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  data[pBt->pageSi
74e0: 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64  ze] == (unsigned
74f0: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
7500: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7510: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
7520: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
7530: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
7540: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7550: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7560: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
7570: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
7580: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
7590: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 66  .  data[hdr] = f
75a0: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
75b0: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
75c0: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
75d0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
75e0: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
75f0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
7600: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
7610: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
7620: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
7630: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
7640: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7650: 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64  - first;.  decod
7660: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
7670: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68  ags);.  pPage->h
7680: 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a  drOffset = hdr;.
7690: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
76a0: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
76b0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
76c0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 0;.  pPage->id
76d0: 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50  xShift = 0;.  pP
76e0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
76f0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
7700: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 1;.}../*.** Ge
7710: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
7720: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
7730: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
7740: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
7750: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
7760: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
7770: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
7780: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
7790: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
77a0: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
77b0: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
77c0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
77d0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
77e0: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
77f0: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
7800: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
7810: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
7820: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
7830: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
7840: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
7850: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
7860: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
7870: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
7880: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
7890: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
78a0: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
78b0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
78c0: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
78d0: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
78e0: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
78f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
7900: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
7910: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
7920: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
7930: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
7940: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7950: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
7960: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
7970: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
7980: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
7990: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
79a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
79b0: 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44  tent        /* D
79c0: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
79d0: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
79e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
79f0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7a00: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
7a10: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
7a20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7a30: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7a40: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7a50: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
7a60: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
7a70: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
7a80: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
7a90: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
7aa0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20  n rc;.  pPage = 
7ab0: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
7ac0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
7ad0: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
7ae0: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
7af0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7b00: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
7b10: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
7b20: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
7b30: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
7b40: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
7b50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7b60: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
7b70: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
7b80: 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
7b90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7ba0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
7bb0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
7bc0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
7bd0: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
7be0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
7bf0: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
7c00: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
7c10: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
7c20: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
7c30: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
7c40: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
7c50: 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
7c60: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
7c70: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
7c80: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
7c90: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
7ca0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
7cb0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
7cc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
7cd0: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
7ce0: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
7cf0: 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e,    /* Write t
7d00: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
7d10: 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  here */.  MemPag
7d20: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 2f  e *pParent     /
7d30: 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65 20  * Parent of the 
7d40: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
7d50: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
7d60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7d70: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7d80: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
7d90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7da0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7db0: 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  ; .  }.  rc = sq
7dc0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
7dd0: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
7de0: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
7df0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7e00: 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
7e10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
7e20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
7e30: 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70  tPage(*ppPage, p
7e40: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72  Parent);.  }.  r
7e50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7e60: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
7e70: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
7e80: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
7e90: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
7ea0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
7eb0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e  te3BtreeGetPage.
7ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7ed0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
7ee0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
7ef0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
7f00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
7f10: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
7f20: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
7f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70  ;.    assert( &p
7f40: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
7f50: 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
7f60: 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ]==(unsigned cha
7f70: 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  r*)pPage );.    
7f80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7f90: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7fa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
7fc0: 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44  rUnref(pPage->pD
7fd0: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
7fe0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7ff0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
8000: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
8010: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a  ount for a page.
8020: 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ** reaches zero.
8030: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72    We need to unr
8040: 65 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  ef the pParent p
8050: 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74  ointer when that
8060: 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a  .** happens..*/.
8070: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8080: 44 65 73 74 72 75 63 74 6f 72 28 44 62 50 61 67  Destructor(DbPag
8090: 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61  e *pData, int pa
80a0: 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61  geSize){.  MemPa
80b0: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
80c0: 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
80d0: 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67   7)==0 );.  pPag
80e0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
80f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
8100: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66  tra(pData);.  if
8110: 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
8120: 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
8130: 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  *pParent = pPage
8140: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 61  ->pParent;.    a
8150: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8160: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8170: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8180: 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
8190: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  nt = 0;.    rele
81a0: 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29  asePage(pParent)
81b0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69  ;.  }.  pPage->i
81c0: 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  sInit = 0;.}../*
81d0: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
81e0: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
81f0: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
8200: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
8210: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
8220: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
8230: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
8240: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
8250: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
8260: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
8270: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
8280: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
8290: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
82a0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
82b0: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
82c0: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
82d0: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
82e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
82f0: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
8300: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
8310: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
8320: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
8330: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20  (DbPage *pData, 
8340: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
8350: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
8360: 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65  .  assert( (page
8370: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
8380: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
8390: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
83a0: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
83b0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
83c0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
83d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
83e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
83f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8400: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
8410: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
8420: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
8430: 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  age, pPage->pPar
8440: 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ent);.  }.}../*.
8450: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
8460: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
8470: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
8480: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
8490: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
84a0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
84b0: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
84c0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
84d0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
84e0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
84f0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
8500: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
8510: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
8520: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
8530: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
8540: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
8550: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
8560: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
8570: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
8580: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
8590: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
85a0: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
85b0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
85c0: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
85d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
85e0: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
85f0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
8600: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
8610: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
8620: 20 73 71 6c 69 74 65 33 20 2a 70 53 71 6c 69 74   sqlite3 *pSqlit
8630: 65 2c 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f  e,       /* Asso
8640: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
8650: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
8660: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
8670: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8680: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
8690: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
86a0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
86c0: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  Options */.){.  
86d0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
86e0: 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  s;      /* The V
86f0: 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
8700: 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74  is btree */.  Bt
8710: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
8720: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
8730: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
8740: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
8750: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
8760: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
8770: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
8780: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8790: 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ;.  int nReserve
87a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
87b0: 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
87c0: 3b 0a 0a 20 20 69 66 28 20 70 53 71 6c 69 74 65  ;..  if( pSqlite
87d0: 20 29 7b 0a 20 20 20 20 70 56 66 73 20 3d 20 70   ){.    pVfs = p
87e0: 53 71 6c 69 74 65 2d 3e 70 56 66 73 3b 0a 20 20  Sqlite->pVfs;.  
87f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 56 66 73 20  }else{.    pVfs 
8800: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
8810: 6e 64 28 30 29 3b 0a 20 20 7d 0a 20 20 61 73 73  nd(0);.  }.  ass
8820: 65 72 74 28 20 70 53 71 6c 69 74 65 3d 3d 30 20  ert( pSqlite==0 
8830: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
8840: 5f 68 65 6c 64 28 70 53 71 6c 69 74 65 2d 3e 6d  _held(pSqlite->m
8850: 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  utex) );..  /* S
8860: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
8870: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
8880: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
8890: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
88a0: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
88b0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
88c0: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
88d0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
88e0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
88f0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
8900: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
8910: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
8920: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
8930: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
8940: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
8950: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
8960: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
8970: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8980: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
8990: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
89a0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
89b0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
89c0: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
89d0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
89e0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
89f0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
8a00: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
8a10: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
8a20: 65 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73 71 6c  endif..  p = sql
8a30: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
8a40: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
8a50: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
8a60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8a70: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
8a80: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
8a90: 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69 74 65 20  E;.  p->pSqlite 
8aa0: 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 23 69 66 20  = pSqlite;..#if 
8ab0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8ac0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
8ad0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
8ae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
8af0: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
8b00: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
8b10: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
8b20: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
8b30: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
8b40: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
8b50: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
8b60: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
8b70: 20 20 2a 2f 0a 20 20 69 66 28 20 28 66 6c 61 67    */.  if( (flag
8b80: 73 20 26 20 42 54 52 45 45 5f 50 52 49 56 41 54  s & BTREE_PRIVAT
8b90: 45 29 3d 3d 30 0a 20 20 20 26 26 20 69 73 4d 65  E)==0.   && isMe
8ba0: 6d 64 62 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69  mdb==0.   && zFi
8bb0: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
8bc0: 61 6d 65 5b 30 5d 0a 20 20 20 26 26 20 73 71 6c  ame[0].   && sql
8bd0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
8be0: 6e 61 62 6c 65 64 0a 20 20 29 7b 0a 20 20 20 20  nabled.  ){.    
8bf0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
8c00: 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ame = (char *)sq
8c10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66  lite3_malloc(pVf
8c20: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a  s->mxPathname);.
8c30: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
8c40: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
8c50: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
8c60: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  = 1;.    if( !zF
8c70: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
8c80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8c90: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
8ca0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8cc0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
8cd0: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
8ce0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
8cf0: 3b 0a 20 20 20 20 6d 75 74 65 78 53 68 61 72 65  ;.    mutexShare
8d00: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  d = sqlite3_mute
8d10: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
8d20: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
8d30: 45 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ER);.    sqlite3
8d40: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
8d50: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 66  exShared);.    f
8d60: 6f 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68  or(pBt=sqlite3Sh
8d70: 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70  aredCacheList; p
8d80: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
8d90: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
8da0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
8db0: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
8dc0: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
8dd0: 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
8de0: 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
8df0: 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20 20  Pager)) ){.     
8e00: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
8e10: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52  .        pBt->nR
8e20: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  ef++;.        br
8e30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8e40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d   }.    sqlite3_m
8e50: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
8e60: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 73 71 6c  Shared);.    sql
8e70: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
8e80: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  athname);.  }.#e
8e90: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
8ea0: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
8eb0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8ec0: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
8ed0: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
8ee0: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
8ef0: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
8f00: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
8f10: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
8f20: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
8f30: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
8f40: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
8f50: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
8f60: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
8f70: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
8f80: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
8f90: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
8fa0: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
8fb0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
8fc0: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
8fd0: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
8fe0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
8ff0: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
9000: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
9010: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
9020: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
9030: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
9040: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
9050: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
9060: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
9070: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
9080: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
9090: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
90a0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
90b0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
90c0: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
90d0: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
90e0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54  , zFilename, EXT
90f0: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b  RA_SIZE, flags);
9100: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9110: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9120: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9130: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
9140: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
9150: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
9160: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
9170: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
9190: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
91a0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ut;.    }.    p-
91b0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
91c0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
91d0: 65 74 44 65 73 74 72 75 63 74 6f 72 28 70 42 74  etDestructor(pBt
91e0: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 44 65  ->pPager, pageDe
91f0: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 73  structor);.    s
9200: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
9210: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
9220: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
9230: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
9240: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
9250: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
9260: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
9270: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
9280: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
9290: 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  er);.    pBt->pa
92a0: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
92b0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  e(&zDbHeader[16]
92c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
92d0: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
92e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
92f0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
9300: 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
9310: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
9320: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
9330: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
9340: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
9350: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
9360: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 70 42 74  _SIZE;.      pBt
9370: 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d  ->maxEmbedFrac =
9380: 20 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f   64;   /* 25% */
9390: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45  .      pBt->minE
93a0: 6d 62 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20  mbedFrac = 32;  
93b0: 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20   /* 12.5% */.   
93c0: 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46     pBt->minLeafF
93d0: 72 61 63 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20  rac = 32;    /* 
93e0: 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66  12.5% */.#ifndef
93f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9400: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
9410: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
9420: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
9430: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
9440: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
9450: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
9460: 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
9470: 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
9480: 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
9490: 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
94a0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
94b0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
94c0: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
94d0: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
94e0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
94f0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
9500: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
9510: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
9520: 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
9530: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
9540: 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
9550: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
9560: 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
9570: 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
9580: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
9590: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
95a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
95b0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
95c0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
95d0: 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
95e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
95f0: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
9600: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
9610: 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
9620: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
9630: 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
9640: 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
9650: 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  e{.      nReserv
9660: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
9670: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 61  ];.      pBt->ma
9680: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62  xEmbedFrac = zDb
9690: 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20  Header[21];.    
96a0: 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46    pBt->minEmbedF
96b0: 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rac = zDbHeader[
96c0: 32 32 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  22];.      pBt->
96d0: 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44  minLeafFrac = zD
96e0: 62 48 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20  bHeader[23];.   
96f0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
9700: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
9710: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
9720: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
9730: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
9740: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
9750: 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
9760: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
9770: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
9780: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
9790: 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
97a0: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
97b0: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62   }.    pBt->usab
97c0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
97d0: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
97e0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
97f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
9800: 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
9810: 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
9820: 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
9830: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
9840: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
9850: 61 67 65 72 2c 20 70 42 74 2d 3e 70 61 67 65 53  ager, pBt->pageS
9860: 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64  ize);.   .#if !d
9870: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9880: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
9890: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
98a0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
98b0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
98c0: 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
98d0: 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
98e0: 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
98f0: 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
9900: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
9910: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  rable ){.      s
9920: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
9930: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
9940: 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
9950: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
9960: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  d = sqlite3_mute
9970: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
9980: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
9990: 45 52 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ER);.      pBt->
99a0: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
99b0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
99c0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
99d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
99e0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
99f0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
9a00: 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  t->pNext = sqlit
9a10: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
9a20: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
9a30: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
9a40: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
9a50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9a60: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
9a70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
9a80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9a90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9aa0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
9ab0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9ac0: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
9ad0: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
9ae0: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
9af0: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
9b00: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
9b10: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
9b20: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
9b30: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
9b40: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
9b50: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
9b60: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
9b70: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
9b80: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
9b90: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
9ba0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
9bb0: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
9bc0: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
9bd0: 69 3c 70 53 71 6c 69 74 65 2d 3e 6e 44 62 3b 20  i<pSqlite->nDb; 
9be0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9bf0: 28 70 53 69 62 20 3d 20 70 53 71 6c 69 74 65 2d  (pSib = pSqlite-
9c00: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
9c10: 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
9c20: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
9c30: 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
9c40: 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
9c50: 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
9c60: 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
9c70: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
9c80: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
9c90: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
9ca0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
9cb0: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
9cc0: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
9cd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9ce0: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
9cf0: 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
9d00: 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
9d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
9d20: 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
9d30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9d40: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
9d50: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
9d60: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
9d70: 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
9d80: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
9d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9da0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
9db0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
9dc0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
9dd0: 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
9de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
9df0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9e00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
9e10: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
9e20: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
9e30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9e40: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
9e50: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
9e60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9e70: 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
9e80: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
9e90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9ea0: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
9eb0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
9ec0: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
9ed0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9ee0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
9ef0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
9f00: 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
9f10: 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
9f20: 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
9f30: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
9f40: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
9f50: 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
9f60: 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
9f70: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
9f80: 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
9f90: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
9fa0: 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
9fb0: 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
9fc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9fd0: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
9fe0: 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
9ff0: 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
a000: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a010: 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65  D_CACHE.  sqlite
a020: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
a030: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ;.  BtShared *pL
a040: 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
a050: 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
a060: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a070: 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
a080: 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65  tex) );.  pMaste
a090: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  r = sqlite3_mute
a0a0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
a0b0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
a0c0: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
a0d0: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
a0e0: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
a0f0: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
a100: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
a110: 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  ( sqlite3SharedC
a120: 61 63 68 65 4c 69 73 74 3d 3d 70 42 74 20 29 7b  acheList==pBt ){
a130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 68  .      sqlite3Sh
a140: 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20  aredCacheList = 
a150: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
a160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
a170: 73 74 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72  st = sqlite3Shar
a180: 65 64 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20  edCacheList;.   
a190: 20 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20     while( pList 
a1a0: 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
a1b0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
a1c0: 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
a1d0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
a1e0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
a1f0: 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
a200: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
a210: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a220: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
a230: 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
a240: 78 29 3b 0a 20 20 20 20 72 65 6d 6f 76 65 64 20  x);.    removed 
a250: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
a260: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
a270: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
a280: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
a290: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
a2a0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
a2b0: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
a2c0: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
a2d0: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
a2e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
a2f0: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
a300: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
a310: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
a320: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
a330: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
a340: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
a350: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
a360: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
a370: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
a380: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
a390: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
a3a0: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
a3b0: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
a3c0: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
a3d0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
a3e0: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
a3f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
a400: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
a410: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
a420: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
a430: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
a440: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
a450: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
a460: 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
a470: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
a480: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
a490: 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
a4a0: 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
a4b0: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
a4c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
a4d0: 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
a4e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
a4f0: 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
a500: 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
a510: 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
a520: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
a530: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
a540: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
a550: 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
a560: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
a570: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
a580: 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
a590: 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
a5a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
a5b0: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
a5c0: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
a5d0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
a5e0: 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
a5f0: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
a600: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
a610: 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
a620: 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
a630: 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
a640: 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
a650: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
a660: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
a670: 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
a680: 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
a690: 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
a6a0: 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
a6b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
a6c0: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
a6d0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
a6e0: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
a6f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
a700: 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
a710: 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
a720: 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
a730: 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
a740: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
a750: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
a760: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73  >pSchema);.    s
a770: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
a780: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
a790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a7a0: 44 5f 43 41 43 48 45 0a 20 20 65 6c 73 65 7b 0a  D_CACHE.  else{.
a7b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77      assert( p->w
a7c0: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
a7d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
a7e0: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  ocked==0 );.    
a7f0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
a800: 62 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ble );.    if( p
a810: 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
a820: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
a830: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 2d  Next;.    if( p-
a840: 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
a850: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
a860: 72 65 76 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rev;.  }.#endif.
a870: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a880: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
a890: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
a8a0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
a8b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
a8c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
a8d0: 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 45 6e 74  CACHE)./*.** Ent
a8e0: 65 72 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  er a mutex on th
a8f0: 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 6f 62  e given BTree ob
a900: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ject..**.** If t
a910: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 6e 6f 74  he object is not
a920: 20 73 68 61 72 61 62 6c 65 2c 20 74 68 65 6e 20   sharable, then 
a930: 6e 6f 20 6d 75 74 65 78 20 69 73 20 65 76 65 72  no mutex is ever
a940: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 61 6e 64   required.** and
a950: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a960: 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 75   a no-op.  The u
a970: 6e 64 65 72 6c 79 69 6e 67 20 6d 75 74 65 78 20  nderlying mutex 
a980: 69 73 20 6e 6f 6e 2d 72 65 63 75 72 73 69 76 65  is non-recursive
a990: 2e 0a 2a 2a 20 42 75 74 20 77 65 20 6b 65 65 70  ..** But we keep
a9a0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
a9b0: 6e 74 20 69 6e 20 42 74 72 65 65 2e 77 61 6e 74  nt in Btree.want
a9c0: 54 6f 4c 6f 63 6b 20 73 6f 20 74 68 65 20 62 65  ToLock so the be
a9d0: 68 61 76 69 6f 72 0a 2a 2a 20 6f 66 20 74 68 69  havior.** of thi
a9e0: 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 72  s interface is r
a9f0: 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  ecursive..**.** 
aa00: 54 6f 20 61 76 6f 69 64 20 64 65 61 64 6c 6f 63  To avoid deadloc
aa10: 6b 73 2c 20 6d 75 6c 74 69 70 6c 65 20 42 74 72  ks, multiple Btr
aa20: 65 65 73 20 61 72 65 20 6c 6f 63 6b 65 64 20 69  ees are locked i
aa30: 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
aa40: 0a 2a 2a 20 62 79 20 61 6c 6c 20 64 61 74 61 62  .** by all datab
aa50: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
aa60: 20 20 54 68 65 20 70 2d 3e 70 4e 65 78 74 20 69    The p->pNext i
aa70: 73 20 61 20 6c 69 73 74 20 6f 66 20 6f 74 68 65  s a list of othe
aa80: 72 0a 2a 2a 20 42 74 72 65 65 73 20 62 65 6c 6f  r.** Btrees belo
aa90: 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
aaa0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
aab0: 63 74 69 6f 6e 20 61 73 20 74 68 65 20 70 20 42  ction as the p B
aac0: 74 72 65 65 0a 2a 2a 20 77 68 69 63 68 20 6e 65  tree.** which ne
aad0: 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
aae0: 61 66 74 65 72 20 70 2e 20 20 49 66 20 77 65 20  after p.  If we 
aaf0: 63 61 6e 6e 6f 74 20 67 65 74 20 61 20 6c 6f 63  cannot get a loc
ab00: 6b 20 6f 6e 0a 2a 2a 20 70 2c 20 74 68 65 6e 20  k on.** p, then 
ab10: 66 69 72 73 74 20 75 6e 6c 6f 63 6b 20 61 6c 6c  first unlock all
ab20: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 73 20 6f   of the others o
ab30: 6e 20 70 2d 3e 70 4e 65 78 74 2c 20 74 68 65 6e  n p->pNext, then
ab40: 20 77 61 69 74 0a 2a 2a 20 66 6f 72 20 74 68 65   wait.** for the
ab50: 20 6c 6f 63 6b 20 74 6f 20 62 65 63 6f 6d 65 20   lock to become 
ab60: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 70 2c 20  available on p, 
ab70: 74 68 65 6e 20 72 65 6c 6f 63 6b 20 61 6c 6c 20  then relock all 
ab80: 6f 66 20 74 68 65 0a 2a 2a 20 73 75 62 73 65 71  of the.** subseq
ab90: 75 65 6e 74 20 42 74 72 65 65 73 20 74 68 61 74  uent Btrees that
aba0: 20 64 65 73 69 72 65 20 61 20 6c 6f 63 6b 2e 0a   desire a lock..
abb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
abc0: 74 72 65 65 45 6e 74 65 72 28 42 74 72 65 65 20  treeEnter(Btree 
abd0: 2a 70 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 4c  *p){.  Btree *pL
abe0: 61 74 65 72 3b 0a 0a 20 20 2f 2a 20 53 6f 6d 65  ater;..  /* Some
abf0: 20 62 61 73 69 63 20 73 61 6e 69 74 79 20 63 68   basic sanity ch
ac00: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 42 74  ecking on the Bt
ac10: 72 65 65 2e 20 20 54 68 65 20 6c 69 73 74 20 6f  ree.  The list o
ac20: 66 20 42 74 72 65 65 73 0a 20 20 2a 2a 20 63 6f  f Btrees.  ** co
ac30: 6e 6e 65 63 74 65 64 20 62 79 20 70 4e 65 78 74  nnected by pNext
ac40: 20 61 6e 64 20 70 50 72 65 76 20 73 68 6f 75 6c   and pPrev shoul
ac50: 64 20 62 65 20 69 6e 20 73 6f 72 74 65 64 20 6f  d be in sorted o
ac60: 72 64 65 72 20 62 79 0a 20 20 2a 2a 20 42 74 72  rder by.  ** Btr
ac70: 65 65 2e 70 42 74 20 76 61 6c 75 65 2e 20 41 6c  ee.pBt value. Al
ac80: 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  l elements of th
ac90: 65 20 6c 69 73 74 20 73 68 6f 75 6c 64 20 62 65  e list should be
aca0: 6c 6f 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 68 65  long to.  ** the
acb0: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
acc0: 2e 20 4f 6e 6c 79 20 73 68 61 72 65 64 20 42 74  . Only shared Bt
acd0: 72 65 65 73 20 61 72 65 20 6f 6e 20 74 68 65 20  rees are on the 
ace0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  list. */.  asser
acf0: 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c  t( p->pNext==0 |
ad00: 7c 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3e  | p->pNext->pBt>
ad10: 70 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  p->pBt );.  asse
ad20: 72 74 28 20 70 2d 3e 70 50 72 65 76 3d 3d 30 20  rt( p->pPrev==0 
ad30: 7c 7c 20 70 2d 3e 70 50 72 65 76 2d 3e 70 42 74  || p->pPrev->pBt
ad40: 3c 70 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  <p->pBt );.  ass
ad50: 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
ad60: 20 7c 7c 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 53   || p->pNext->pS
ad70: 71 6c 69 74 65 3d 3d 70 2d 3e 70 53 71 6c 69 74  qlite==p->pSqlit
ad80: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
ad90: 2d 3e 70 50 72 65 76 3d 3d 30 20 7c 7c 20 70 2d  ->pPrev==0 || p-
ada0: 3e 70 50 72 65 76 2d 3e 70 53 71 6c 69 74 65 3d  >pPrev->pSqlite=
adb0: 3d 70 2d 3e 70 53 71 6c 69 74 65 20 29 3b 0a 20  =p->pSqlite );. 
adc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
add0: 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 70 4e 65 78  able || (p->pNex
ade0: 74 3d 3d 30 20 26 26 20 70 2d 3e 70 50 72 65 76  t==0 && p->pPrev
adf0: 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  ==0) );..  /* Ch
ae00: 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  eck for locking 
ae10: 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20  consistency */. 
ae20: 20 61 73 73 65 72 74 28 20 21 70 2d 3e 6c 6f 63   assert( !p->loc
ae30: 6b 65 64 20 7c 7c 20 70 2d 3e 77 61 6e 74 54 6f  ked || p->wantTo
ae40: 4c 6f 63 6b 3e 30 20 29 3b 0a 20 20 61 73 73 65  Lock>0 );.  asse
ae50: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
ae60: 7c 7c 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  || p->wantToLock
ae70: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  ==0 );..  /* We 
ae80: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
ae90: 6f 6c 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  old a lock on th
aea0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
aeb0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72  ction */.  asser
aec0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
aed0: 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65  _held(p->pSqlite
aee0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
aef0: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
af00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 77  ) return;.  p->w
af10: 61 6e 74 54 6f 4c 6f 63 6b 2b 2b 3b 0a 20 20 69  antToLock++;.  i
af20: 66 28 20 70 2d 3e 6c 6f 63 6b 65 64 20 29 20 72  f( p->locked ) r
af30: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 20  eturn;..  /* In 
af40: 6d 6f 73 74 20 63 61 73 65 73 2c 20 77 65 20 73  most cases, we s
af50: 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f  hould be able to
af60: 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
af70: 6b 20 77 65 0a 20 20 2a 2a 20 77 61 6e 74 20 77  k we.  ** want w
af80: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
af90: 20 67 6f 20 74 68 72 6f 75 67 68 74 20 74 68 65   go throught the
afa0: 20 61 73 63 65 6e 64 69 6e 67 20 6c 6f 63 6b 0a   ascending lock.
afb0: 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 74    ** procedure t
afc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 20 20 4a 75  hat follows.  Ju
afd0: 73 74 20 62 65 20 73 75 72 65 20 6e 6f 74 20 74  st be sure not t
afe0: 6f 20 62 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  o block..  */.  
aff0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  if( sqlite3_mute
b000: 78 5f 74 72 79 28 70 2d 3e 70 42 74 2d 3e 6d 75  x_try(p->pBt->mu
b010: 74 65 78 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  tex)==SQLITE_OK 
b020: 29 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 65 64  ){.    p->locked
b030: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
b040: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 61  ;.  }..  /* To a
b050: 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 2c 20 66  void deadlock, f
b060: 69 72 73 74 20 72 65 6c 65 61 73 65 20 61 6c 6c  irst release all
b070: 20 6c 6f 63 6b 73 20 77 69 74 68 20 61 20 6c 61   locks with a la
b080: 72 67 65 72 0a 20 20 2a 2a 20 42 74 53 68 61 72  rger.  ** BtShar
b090: 65 64 20 61 64 64 72 65 73 73 2e 20 20 54 68 65  ed address.  The
b0a0: 6e 20 61 63 71 75 69 72 65 20 6f 75 72 20 6c 6f  n acquire our lo
b0b0: 63 6b 2e 20 20 54 68 65 6e 20 72 65 61 63 71 75  ck.  Then reacqu
b0c0: 69 72 65 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68  ire.  ** the oth
b0d0: 65 72 20 42 74 53 68 61 72 65 64 20 6c 6f 63 6b  er BtShared lock
b0e0: 73 20 74 68 61 74 20 77 65 20 75 73 65 64 20 74  s that we used t
b0f0: 6f 20 68 6f 6c 64 20 69 6e 20 61 73 63 65 6e 64  o hold in ascend
b100: 69 6e 67 0a 20 20 2a 2a 20 6f 72 64 65 72 2e 0a  ing.  ** order..
b110: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 61 74 65    */.  for(pLate
b120: 72 3d 70 2d 3e 70 4e 65 78 74 3b 20 70 4c 61 74  r=p->pNext; pLat
b130: 65 72 3b 20 70 4c 61 74 65 72 3d 70 4c 61 74 65  er; pLater=pLate
b140: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61  r->pNext){.    a
b150: 73 73 65 72 74 28 20 70 4c 61 74 65 72 2d 3e 73  ssert( pLater->s
b160: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 20 20 61  harable );.    a
b170: 73 73 65 72 74 28 20 70 4c 61 74 65 72 2d 3e 70  ssert( pLater->p
b180: 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 4c 61 74 65  Next==0 || pLate
b190: 72 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3e 70 4c  r->pNext->pBt>pL
b1a0: 61 74 65 72 2d 3e 70 42 74 20 29 3b 0a 20 20 20  ater->pBt );.   
b1b0: 20 61 73 73 65 72 74 28 20 21 70 4c 61 74 65 72   assert( !pLater
b1c0: 2d 3e 6c 6f 63 6b 65 64 20 7c 7c 20 70 4c 61 74  ->locked || pLat
b1d0: 65 72 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3e 30  er->wantToLock>0
b1e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 61 74   );.    if( pLat
b1f0: 65 72 2d 3e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  er->locked ){.  
b200: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
b210: 78 5f 6c 65 61 76 65 28 70 4c 61 74 65 72 2d 3e  x_leave(pLater->
b220: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
b230: 20 20 20 70 4c 61 74 65 72 2d 3e 6c 6f 63 6b 65     pLater->locke
b240: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 0;.    }.  }
b250: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b260: 5f 65 6e 74 65 72 28 70 2d 3e 70 42 74 2d 3e 6d  _enter(p->pBt->m
b270: 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 4c 61  utex);.  for(pLa
b280: 74 65 72 3d 70 2d 3e 70 4e 65 78 74 3b 20 70 4c  ter=p->pNext; pL
b290: 61 74 65 72 3b 20 70 4c 61 74 65 72 3d 70 4c 61  ater; pLater=pLa
b2a0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
b2b0: 20 69 66 28 20 70 4c 61 74 65 72 2d 3e 77 61 6e   if( pLater->wan
b2c0: 74 54 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  tToLock ){.     
b2d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
b2e0: 6e 74 65 72 28 70 4c 61 74 65 72 2d 3e 70 42 74  nter(pLater->pBt
b2f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
b300: 70 4c 61 74 65 72 2d 3e 6c 6f 63 6b 65 64 20 3d  pLater->locked =
b310: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
b320: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
b330: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
b340: 43 48 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78  CHE */../*.** Ex
b350: 69 74 20 74 68 65 20 72 65 63 75 72 73 69 76 65  it the recursive
b360: 20 6d 75 74 65 78 20 6f 6e 20 61 20 42 74 72 65   mutex on a Btre
b370: 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  e..*/.#if SQLITE
b380: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 21  _THREADSAFE && !
b390: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b3a0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
b3b0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  ).void sqlite3Bt
b3c0: 72 65 65 4c 65 61 76 65 28 42 74 72 65 65 20 2a  reeLeave(Btree *
b3d0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 68 61  p){.  if( p->sha
b3e0: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 61 73 73  rable ){.    ass
b3f0: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
b400: 63 6b 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 77  ck>0 );.    p->w
b410: 61 6e 74 54 6f 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  antToLock--;.   
b420: 20 69 66 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f   if( p->wantToLo
b430: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ck==0 ){.      a
b440: 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
b450: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
b460: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 2d  3_mutex_leave(p-
b470: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  >pBt->mutex);.  
b480: 20 20 20 20 70 2d 3e 6c 6f 63 6b 65 64 20 3d 20      p->locked = 
b490: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  0;.    }.  }.}.#
b4a0: 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49  endif...#if SQLI
b4b0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
b4c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b4d0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
b4e0: 48 45 29 0a 2f 2a 0a 2a 2a 20 53 68 6f 72 74 2d  HE)./*.** Short-
b4f0: 63 75 74 73 20 66 6f 72 20 65 6e 74 65 72 69 6e  cuts for enterin
b500: 67 20 61 6e 64 20 6c 65 61 76 69 6e 67 20 6d 75  g and leaving mu
b510: 74 65 78 65 73 20 6f 6e 20 61 20 63 75 72 73 6f  texes on a curso
b520: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b530: 64 20 63 75 72 73 6f 72 4c 65 61 76 65 28 42 74  d cursorLeave(Bt
b540: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 73 71  Cursor *p){.  sq
b550: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
b560: 70 2d 3e 70 42 74 29 3b 0a 7d 0a 73 74 61 74 69  p->pBt);.}.stati
b570: 63 20 76 6f 69 64 20 63 75 72 73 6f 72 45 6e 74  c void cursorEnt
b580: 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  er(BtCursor *pCu
b590: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r){.  sqlite3Btr
b5a0: 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42  eeEnter(pCur->pB
b5b0: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  t);.}.#else.# de
b5c0: 66 69 6e 65 20 63 75 72 73 6f 72 45 6e 74 65 72  fine cursorEnter
b5d0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 63 75 72  (X).# define cur
b5e0: 73 6f 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64  sorLeave(X).#end
b5f0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
b600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
b610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
b620: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
b630: 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  r callback funct
b640: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
b650: 74 65 33 42 74 72 65 65 53 65 74 42 75 73 79 48  te3BtreeSetBusyH
b660: 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a 70 2c  andler(Btree *p,
b670: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48   BusyHandler *pH
b680: 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53 68 61  andler){.  BtSha
b690: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
b6a0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
b6b0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
b6c0: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
b6d0: 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c   pHandler;.  sql
b6e0: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
b6f0: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
b700: 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a  ger, pHandler);.
b710: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b720: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
b730: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b740: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
b750: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
b760: 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
b770: 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
b780: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
b790: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
b7a0: 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
b7b0: 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
b7c0: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
b7d0: 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
b7e0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
b7f0: 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
b800: 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
b810: 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
b820: 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
b830: 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
b840: 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
b850: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
b860: 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
b870: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
b880: 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
b890: 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
b8a0: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
b8b0: 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
b8c0: 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
b8d0: 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
b8e0: 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
b8f0: 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
b900: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
b910: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
b920: 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
b930: 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
b940: 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
b950: 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
b960: 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
b970: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
b980: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
b990: 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
b9a0: 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
b9b0: 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
b9c0: 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
b9d0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
b9e0: 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
b9f0: 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
ba00: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
ba10: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
ba20: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
ba30: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
ba40: 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
ba50: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
ba60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
ba70: 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
ba80: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
ba90: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
baa0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
bab0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bac0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
bad0: 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
bae0: 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
baf0: 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
bb00: 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
bb10: 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
bb20: 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
bb30: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
bb40: 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
bb50: 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
bb60: 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
bb70: 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
bb80: 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
bb90: 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
bba0: 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
bbb0: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
bbc0: 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
bbd0: 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
bbe0: 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
bbf0: 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
bc00: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
bc10: 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
bc20: 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
bc30: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
bc40: 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
bc50: 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
bc60: 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
bc70: 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
bc80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bc90: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
bca0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
bcb0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
bcc0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
bcd0: 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
bce0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
bcf0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
bd00: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
bd10: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
bd20: 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
bd30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
bd40: 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a  vel, fullSync);.
bd50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
bd60: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
bd70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
bd80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
bd90: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
bda0: 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65  iven btree is se
bdb0: 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65  t to safety leve
bdc0: 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a  l 1.  In other.*
bdd0: 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  * words, return 
bde0: 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28  TRUE if no sync(
bdf0: 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  ) occurs on the 
be00: 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  disk files..*/.i
be10: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
be20: 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65  yncDisabled(Btre
be30: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
be40: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
be50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
be60: 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
be70: 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 73 71 6c  >pPager );.  sql
be80: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
be90: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
bea0: 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74  3PagerNosync(pBt
beb0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  ->pPager);.  sql
bec0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
bed0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bee0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
bef0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
bf00: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
bf10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bf20: 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
bf30: 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
bf40: 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
bf50: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
bf60: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
bf70: 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  per page..**.** 
bf80: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
bf90: 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
bfa0: 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
bfb0: 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
bfc0: 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
bfd0: 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
bfe0: 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
bff0: 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
c000: 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
c010: 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
c020: 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
c030: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
c040: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
c050: 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
c060: 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
c070: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
c080: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
c090: 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
c0a0: 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
c0b0: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
c0c0: 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
c0d0: 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
c0e0: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
c0f0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
c100: 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
c110: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
c120: 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
c130: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
c140: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c150: 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
c160: 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
c170: 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  t unchanged..*/.
c180: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c190: 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
c1a0: 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
c1b0: 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
c1c0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
c1d0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
c1e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c1f0: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
c200: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
c210: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
c220: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
c230: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
c240: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
c250: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
c260: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
c270: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
c280: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
c290: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
c2a0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
c2b0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
c2c0: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
c2d0: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
c2e0: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
c2f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
c300: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
c310: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
c320: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
c330: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
c340: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c350: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
c360: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
c370: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a  >pPager, pageSiz
c380: 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75  e);.  }.  pBt->u
c390: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
c3a0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
c3b0: 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  erve;.  sqlite3B
c3c0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c3d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c3e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c3f0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
c400: 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
c410: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
c420: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
c430: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
c440: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
c450: 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  eSize;.}.int sql
c460: 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
c470: 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
c480: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
c490: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c4a0: 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
c4b0: 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
c4c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73  >usableSize;.  s
c4d0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c4e0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
c4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c500: 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
c510: 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
c520: 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
c530: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
c540: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
c550: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
c560: 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
c570: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
c580: 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
c590: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
c5a0: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
c5b0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
c5c0: 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
c5d0: 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
c5e0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
c5f0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
c600: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
c610: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
c620: 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
c630: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
c640: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
c650: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c660: 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn n;.}.#endif 
c670: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
c680: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
c690: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
c6a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
c6b0: 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
c6c0: 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
c6d0: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
c6e0: 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
c6f0: 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
c700: 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
c710: 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
c720: 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
c730: 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
c740: 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
c750: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
c760: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
c770: 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
c780: 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
c790: 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
c7a0: 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
c7b0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
c7c0: 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
c7d0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
c7e0: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
c7f0: 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
c800: 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
c810: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c820: 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
c830: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
c840: 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
c850: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
c860: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c870: 4b 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61  K;.  int av = (a
c880: 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a  utoVacuum?1:0);.
c890: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
c8a0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
c8b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
c8c0: 64 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75  d && av!=pBt->au
c8d0: 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
c8e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
c8f0: 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
c900: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
c910: 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73  um = av;.  }.  s
c920: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c930: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c940: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c950: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
c960: 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
c970: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
c980: 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
c990: 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
c9a0: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
c9b0: 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
c9c0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c9d0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
c9e0: 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
c9f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
ca00: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
ca10: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
ca20: 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
ca30: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
ca40: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
ca50: 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
ca60: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
ca70: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
ca80: 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
ca90: 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
caa0: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
cab0: 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
cac0: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
cad0: 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
cae0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
caf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
cb00: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
cb10: 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
cb20: 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
cb30: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
cb40: 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
cb50: 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
cb60: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
cb70: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
cb80: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
cb90: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
cba0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
cbb0: 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
cbc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
cbd0: 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
cbe0: 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
cbf0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
cc00: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
cc10: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
cc20: 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
cc30: 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
cc40: 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
cc50: 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
cc60: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
cc70: 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
cc80: 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61  t){.  int rc, pa
cc90: 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67  geSize;.  MemPag
cca0: 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
ccb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
ccc0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
ccd0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
cce0: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
ccf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cd00: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
cd10: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
cd20: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
cd30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cd40: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
cd50: 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20   ..  /* Do some 
cd60: 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
cd70: 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
cd80: 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
cd90: 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
cda0: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
cdb0: 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51   .  */.  rc = SQ
cdc0: 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69  LITE_NOTADB;.  i
cdd0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
cde0: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
cdf0: 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 75  ager)>0 ){.    u
ce00: 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
ce10: 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  1->aData;.    if
ce20: 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
ce30: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
ce40: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
ce50: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
ce60: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
ce70: 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
ce80: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
ce90: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
cea0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
ceb0: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
cec0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
ced0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
cee0: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
cef0: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
cf00: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
cf10: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
cf20: 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65  )!=0 || pageSize
cf30: 3c 35 31 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  <512 ){.      go
cf40: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
cf50: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
cf60: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
cf70: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
cf80: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
cf90: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
cfa0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
cfb0: 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
cfc0: 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
cfd0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 35  Bt->usableSize<5
cfe0: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
cff0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
d000: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
d010: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
d020: 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a 20 20 20  = page1[21];.   
d030: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
d040: 61 63 20 3d 20 70 61 67 65 31 5b 32 32 5d 3b 0a  ac = page1[22];.
d050: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
d060: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 33 5d  Frac = page1[23]
d070: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d080: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d090: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
d0a0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
d0b0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
d0c0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
d0d0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
d0e0: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
d0f0: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
d100: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
d110: 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
d120: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
d130: 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
d140: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
d150: 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
d160: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
d170: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
d180: 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
d190: 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
d1a0: 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
d1b0: 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
d1c0: 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
d1d0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
d1e0: 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
d1f0: 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
d200: 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
d210: 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
d220: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
d230: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
d240: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
d250: 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
d260: 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
d270: 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
d280: 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
d290: 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
d2a0: 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
d2b0: 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
d2c0: 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
d2d0: 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
d2e0: 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
d2f0: 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
d300: 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
d310: 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
d320: 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
d330: 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
d340: 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
d350: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
d360: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
d370: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
d380: 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72  *pBt->maxEmbedFr
d390: 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  ac/255 - 23;.  p
d3a0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
d3b0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
d3c0: 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65  12)*pBt->minEmbe
d3d0: 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
d3e0: 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
d3f0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
d400: 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 35;.  pBt->mi
d410: 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73  nLeaf = (pBt->us
d420: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74  ableSize-12)*pBt
d430: 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32 35  ->minLeafFrac/25
d440: 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42  5 - 23;.  if( pB
d450: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d  t->minLocal>pBt-
d460: 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74  >maxLocal || pBt
d470: 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a  ->maxLocal<0 ){.
d480: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d490: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  nit_failed;.  }.
d4a0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
d4b0: 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
d4c0: 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
d4d0: 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
d4e0: 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
d4f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d500: 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
d510: 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
d520: 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
d530: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
d540: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d550: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d560: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b   works like lock
d570: 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74  Btree() except t
d580: 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f  hat it also invo
d590: 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20  kes the.** busy 
d5a0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72  callback if ther
d5b0: 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e is lock conten
d5c0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
d5d0: 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  int lockBtreeWit
d5e0: 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52  hRetry(Btree *pR
d5f0: 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ef){.  int rc = 
d600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
d610: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d620: 74 65 78 5f 68 65 6c 64 28 70 52 65 66 2d 3e 70  tex_held(pRef->p
d630: 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29  Sqlite->mutex) )
d640: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d650: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d660: 52 65 66 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  Ref->pBt->mutex)
d670: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e   );.  if( pRef->
d680: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
d690: 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e  ONE ){.    u8 in
d6a0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52  Transaction = pR
d6b0: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
d6c0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65  action;.    btre
d6d0: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
d6e0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
d6f0: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
d700: 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20  s(pRef, 0);.    
d710: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
d720: 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61  nsaction = inTra
d730: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52  nsaction;.    pR
d740: 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  ef->inTrans = TR
d750: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66  ANS_NONE;.    if
d760: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d770: 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70  ){.      pRef->p
d780: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
d790: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  --;.    }.    bt
d7a0: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
d7b0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
d7c0: 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a   rc;.}.       ..
d7d0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
d7e0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
d7f0: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
d800: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
d810: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
d820: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
d830: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
d840: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
d850: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
d860: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
d870: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
d880: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d890: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
d8a0: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
d8b0: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
d8c0: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
d8d0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
d8e0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
d8f0: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
d900: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
d910: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
d920: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
d930: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
d940: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
d950: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
d960: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
d970: 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
d980: 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
d990: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d9a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d9b0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
d9c0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
d9d0: 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
d9e0: 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70  >pCursor==0 && p
d9f0: 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
da00: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
da10: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
da20: 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b  t->pPager)>=1 ){
da30: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
da40: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30  pPage1->aData==0
da50: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
da60: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74  age *pPage = pBt
da70: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20  ->pPage1;.      
da80: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
da90: 20 26 28 28 75 38 2a 29 70 50 61 67 65 29 5b 2d   &((u8*)pPage)[-
daa0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
dab0: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
dac0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
dad0: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
dae0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
daf0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
db00: 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  ->pPage1);.    }
db10: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
db20: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69   = 0;.    pBt->i
db30: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  nStmt = 0;.  }.}
db40: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
db50: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79   new database by
db60: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
db70: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
db80: 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a  the.** file..*/.
db90: 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
dba0: 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
dbb0: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
dbc0: 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
dbd0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
dbe0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
dbf0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dc00: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
dc10: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
dc20: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
dc30: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20  (pBt->pPager)>0 
dc40: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
dc50: 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d  OK;.  pP1 = pBt-
dc60: 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
dc70: 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
dc80: 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
dc90: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
dca0: 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
dcb0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
dcc0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
dcd0: 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
dce0: 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
dcf0: 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
dd00: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
dd10: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
dd20: 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32  r)==16 );.  put2
dd30: 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20  byte(&data[16], 
dd40: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
dd50: 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
dd60: 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
dd70: 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74    data[20] = pBt
dd80: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
dd90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
dda0: 64 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e  data[21] = pBt->
ddb0: 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20  maxEmbedFrac;.  
ddc0: 64 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e  data[22] = pBt->
ddd0: 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20  minEmbedFrac;.  
dde0: 64 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e  data[23] = pBt->
ddf0: 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d  minLeafFrac;.  m
de00: 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
de10: 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
de20: 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
de30: 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
de40: 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
de50: 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  .  pBt->pageSize
de60: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
de70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
de80: 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
de90: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
dea0: 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
deb0: 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
dec0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
ded0: 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
dee0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
def0: 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
df00: 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
df10: 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
df20: 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
df30: 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
df40: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
df50: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
df60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
df70: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
df80: 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
df90: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
dfa0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
dfb0: 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
dfc0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
dfd0: 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
dfe0: 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
dff0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
e000: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
e010: 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
e020: 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
e030: 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
e040: 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
e050: 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
e060: 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
e070: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
e080: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
e090: 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
e0a0: 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
e0b0: 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
e0c0: 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
e0d0: 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
e0e0: 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
e0f0: 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
e100: 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
e110: 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
e120: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
e130: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
e140: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
e150: 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
e160: 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
e170: 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
e180: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
e190: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
e1a0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
e1b0: 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
e1c0: 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
e1d0: 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
e1e0: 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
e1f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
e200: 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
e210: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e220: 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
e230: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e240: 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
e250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e260: 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
e270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e280: 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
e290: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
e2a0: 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
e2b0: 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
e2c0: 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
e2d0: 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
e2e0: 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
e2f0: 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
e300: 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
e310: 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
e320: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
e330: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
e340: 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
e350: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
e360: 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
e370: 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
e380: 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
e390: 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
e3a0: 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
e3b0: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
e3c0: 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
e3d0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
e3e0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
e3f0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
e400: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
e410: 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
e420: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
e430: 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
e440: 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
e450: 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
e460: 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
e470: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
e480: 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
e490: 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
e4a0: 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
e4b0: 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
e4c0: 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
e4d0: 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
e4e0: 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
e4f0: 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
e500: 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
e510: 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
e520: 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
e530: 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
e540: 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
e550: 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
e560: 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
e570: 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
e580: 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
e590: 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
e5a0: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
e5b0: 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
e5c0: 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
e5d0: 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
e5e0: 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
e5f0: 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
e600: 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
e610: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
e620: 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
e630: 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68   wrflag){.  BtSh
e640: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
e650: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
e660: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
e670: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
e680: 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
e690: 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
e6a0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
e6b0: 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
e6c0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
e6d0: 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
e6e0: 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
e6f0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
e700: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
e710: 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
e720: 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
e730: 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
e740: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
e750: 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
e760: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
e770: 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
e780: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
e790: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
e7a0: 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
e7b0: 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
e7c0: 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
e7d0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
e7e0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64  .  if( pBt->read
e7f0: 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29  Only && wrflag )
e800: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
e810: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
e820: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
e830: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
e840: 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
e850: 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
e860: 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
e870: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
e880: 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
e890: 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
e8a0: 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
e8b0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e8c0: 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
e8d0: 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
e8e0: 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  TE_BUSY..  */.  
e8f0: 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
e900: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
e910: 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b  ITE && wrflag ){
e920: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
e930: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
e940: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
e950: 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
e960: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
e970: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
e980: 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20  ckBtree(pBt);.  
e990: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
e9a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
e9b0: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
e9c0: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
e9d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e9e0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e9f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ea00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ea10: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
ea20: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
ea30: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
ea40: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
ea50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ea60: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
ea70: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
ea80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ea90: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
eaa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
eab0: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
eac0: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
ead0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
eae0: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
eaf0: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
eb00: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
eb10: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
eb20: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
eb30: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
eb40: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71   &&.          sq
eb50: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
eb60: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 42 75 73  andler(pBt->pBus
eb70: 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 0a 20 20  yHandler) );..  
eb80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
eb90: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
eba0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
ebb0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
ebc0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
ebd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
ebe0: 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
ebf0: 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
ec00: 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
ec10: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
ec20: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
ec30: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
ec40: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
ec50: 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
ec60: 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
ec70: 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  n:.  btreeIntegr
ec80: 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
ec90: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
eca0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ecb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ecc0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
ecd0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
ece0: 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
ecf0: 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
ed00: 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
ed10: 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
ed20: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
ed30: 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
ed40: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
ed50: 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
ed60: 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
ed70: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
ed80: 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
ed90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
eda0: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
edb0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
edc0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
edf0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
ee00: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
ee30: 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
ee40: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ee70: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
ee80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
ee90: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69  ge->pBt;.  int i
eea0: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
eeb0: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
eec0: 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
eed0: 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
eee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
eef0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
ef00: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
ef10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
ef20: 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
ef30: 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
ef40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ef50: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
ef60: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
ef70: 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
ef80: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
ef90: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
efa0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
efb0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
efc0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
efd0: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
efe0: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
eff0: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
f000: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f010: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
f020: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f030: 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
f040: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f050: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
f060: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
f070: 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
f080: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
f090: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
f0a0: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
f0b0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
f0c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f0d0: 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
f0e0: 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
f0f0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
f100: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
f110: 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
f120: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
f130: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
f140: 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
f150: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
f160: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
f170: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
f180: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
f190: 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
f1a0: 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
f1b0: 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
f1c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f1d0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
f1e0: 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
f1f0: 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
f200: 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
f210: 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
f220: 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
f230: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
f240: 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
f250: 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
f260: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
f270: 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
f280: 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
f290: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
f2a0: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
f2b0: 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
f2c0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
f2d0: 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
f2e0: 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
f2f0: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
f300: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
f310: 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
f320: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
f330: 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
f340: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
f350: 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
f360: 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
f370: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
f380: 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f3a0: 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
f3b0: 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
f3c0: 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
f3d0: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
f3e0: 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
f3f0: 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
f400: 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
f410: 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
f420: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
f430: 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
f440: 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
f450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
f460: 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
f470: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
f480: 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
f490: 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
f4a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f4b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f4c0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f4d0: 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
f4e0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
f4f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
f500: 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
f510: 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
f520: 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
f530: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
f540: 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
f550: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
f560: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
f570: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f580: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f590: 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
f5a0: 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
f5b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f5c0: 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
f5d0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
f5e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
f5f0: 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73  nt nCell;..    s
f600: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
f610: 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  age(pPage, 0);. 
f620: 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
f630: 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
f640: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
f650: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
f660: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
f670: 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
f680: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
f690: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
f6a0: 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
f6b0: 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
f6c0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
f6d0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
f6e0: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
f6f0: 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
f700: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
f710: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
f720: 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
f730: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
f740: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
f750: 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
f760: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
f770: 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
f780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f7a0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
f7b0: 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
f7c0: 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
f7d0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
f7e0: 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
f7f0: 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
f800: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
f810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f820: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
f830: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
f840: 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
f850: 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
f860: 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
f870: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
f880: 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
f890: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
f8a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f8b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
f8c0: 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
f8d0: 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
f8e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f8f0: 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
f900: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
f910: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
f920: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
f930: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
f940: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
f950: 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
f960: 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
f970: 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
f980: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
f990: 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
f9a0: 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
f9b0: 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   valid..*/.stati
f9c0: 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
f9d0: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
f9e0: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
f9f0: 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
fa00: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
fa10: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
fa20: 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
fa30: 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
fa40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
fa50: 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
fa60: 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
fa70: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
fa80: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
fa90: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
faa0: 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
fab0: 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
fac0: 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20 20  gno iFreePage   
fad0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
fae0: 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
faf0: 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b  pDbPage to */.){
fb00: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
fb10: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
fb20: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
fb30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
fb40: 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
fb50: 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
fb60: 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
fb70: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
fb80: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
fb90: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
fba0: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
fbb0: 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
fbc0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
fbd0: 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
fbe0: 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
fbf0: 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
fc00: 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
fc10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
fc20: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
fc30: 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  tex) );..  /* Mo
fc40: 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
fc50: 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e  from it's curren
fc60: 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
fc70: 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
fc80: 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
fc90: 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
fca0: 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
fcb0: 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
fcc0: 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
fcd0: 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
fce0: 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
fcf0: 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
fd00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
fd10: 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
fd20: 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
fd30: 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b  age, iFreePage);
fd40: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fd50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
fd60: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
fd70: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
fd80: 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
fd90: 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
fda0: 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
fdb0: 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
fdc0: 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
fdd0: 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
fde0: 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
fdf0: 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
fe00: 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
fe10: 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
fe20: 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
fe30: 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
fe40: 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
fe50: 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
fe60: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
fe70: 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
fe80: 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
fe90: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
fea0: 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
feb0: 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
fec0: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
fed0: 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
fee0: 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
fef0: 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
ff00: 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
ff10: 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
ff20: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
ff30: 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
ff40: 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
ff50: 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
ff60: 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
ff70: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
ff80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ff90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ffa0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
ffb0: 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
ffc0: 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
ffd0: 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
ffe0: 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
fff0: 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
10000 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
10010 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
10020 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
10030 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
10040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10050 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
10060 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
10070 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10080 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
10090 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
100a0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
100b0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
100c0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
100d0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
100e0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
100f0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
10100 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
10110 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
10120 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
10130 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
10140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10150 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
10160 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
10170 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
10180 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10190 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
101a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
101b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
101c0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
101d0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
101e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
101f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
10200 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
10210 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10220 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
10230 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
10240 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
10250 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
10260 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
10270 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
10280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
102a0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
102b0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
102c0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
102d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
102e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
102f0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
10300 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
10310 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
10320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
10330 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
10340 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
10350 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
10360 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
10370 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
10380 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
10390 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
103a0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
103b0 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
103c0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
103d0 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
103e0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
103f0 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
10400 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
10410 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
10420 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
10430 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
10440 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
10450 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
10460 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
10470 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
10480 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
10490 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
104a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
104b0 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
104c0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
104d0 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
104e0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
104f0 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
10500 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
10510 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
10520 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
10530 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
10540 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
10550 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
10560 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
10570 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
10580 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
10590 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
105a0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
105b0 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
105c0 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
105d0 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74   complete..*/.st
105e0 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
105f0 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
10600 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
10610 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50  ){.  Pgno iLastP
10620 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
10630 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74  * Last page in t
10640 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
10650 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
10660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10670 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
10680 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
10690 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
106a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
106b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
106c0 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67 20 3d  ) );.  iLastPg =
106d0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
106e0 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29  if( iLastPg==0 )
106f0 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20  {.    iLastPg = 
10700 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10710 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
10720 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  r);.  }..  if( !
10730 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
10740 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
10750 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
10760 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
10770 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
10780 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
10790 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
107a0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
107b0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
107c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
107d0 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
107e0 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d  List==0 || nFin=
107f0 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20  =iLastPg ){.    
10800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10810 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
10820 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
10830 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
10840 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
10850 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10880 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
10890 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
108a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
108b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
108c0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
108d0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
108e0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
108f0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
10900 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
10910 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
10920 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
10930 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
10940 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
10950 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
10960 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
10970 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
10980 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
10990 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
109a0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
109b0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
109c0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
109d0 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
109e0 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
109f0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
10a00 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
10a10 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
10a20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
10a30 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
10a40 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
10a50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
10a60 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
10a70 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
10a80 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
10a90 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
10aa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10ab0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
10ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
10ae0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
10af0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
10b00 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
10b10 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
10b20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10b30 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
10b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10b50 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
10b60 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
10b70 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
10b80 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
10b90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10ba0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
10bb0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
10bc0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
10bd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10be0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
10bf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
10c00 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
10c10 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
10c20 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
10c30 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
10c40 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
10c50 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
10c60 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
10c70 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
10c80 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
10c90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10ca0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
10cb0 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
10cc0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
10cd0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
10ce0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
10cf0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
10d00 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
10d10 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
10d20 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
10d30 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
10d40 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
10d50 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
10d60 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
10d70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
10d80 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
10d90 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
10da0 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
10db0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
10dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10dd0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
10de0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
10df0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
10e00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10e10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
10e20 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
10e30 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
10e40 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
10e50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10e60 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
10e70 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
10e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10e90 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
10ea0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
10eb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ec0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
10ed0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
10ee0 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
10ef0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
10f00 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
10f10 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
10f20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
10f30 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
10f40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
10f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10f70 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 7d 0a     } .    }.  }.
10f80 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d  .  pBt->nTrunc =
10f90 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20   iLastPg - 1;.  
10fa0 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75  while( pBt->nTru
10fb0 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  nc==PENDING_BYTE
10fc0 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
10fd0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
10fe0 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20  Bt->nTrunc) ){. 
10ff0 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d     pBt->nTrunc--
11000 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11010 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11020 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
11030 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
11040 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
11050 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
11060 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
11070 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
11080 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
11090 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
110a0 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
110b0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
110c0 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
110d0 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
110e0 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
110f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
11100 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
11110 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
11120 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
11130 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c   occured,.** SQL
11140 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11150 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
11160 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11170 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
11180 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
11190 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
111a0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
111b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
111c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
111d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
111e0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
111f0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
11200 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
11210 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
11220 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
11230 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
11240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
11250 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
11260 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
11270 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
11280 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
11290 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29  cuumStep(pBt, 0)
112a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
112b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
112c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
112d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
112e0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
112f0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
11300 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
11310 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11320 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
11330 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
11340 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
11350 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11360 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
11370 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
11380 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11390 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
113a0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
113b0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
113c0 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
113d0 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
113e0 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
113f0 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
11400 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
11410 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
11420 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
11430 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
11440 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
11450 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
11460 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54   *pBt, Pgno *pnT
11470 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
11480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
11490 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
114a0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e  Bt->pPager;.#ifn
114b0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
114c0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
114d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
114e0 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ger);.#endif..  
114f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11500 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11510 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
11520 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
11530 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
11540 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
11550 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
11560 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
11570 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  {.    Pgno nFin 
11580 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42  = 0;..    if( pB
11590 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a  t->nTrunc==0 ){.
115a0 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65        Pgno nFree
115b0 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74  ;.      Pgno nPt
115c0 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73  rmap;.      cons
115d0 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
115e0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
115f0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 73    Pgno nOrig = s
11600 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
11610 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
11620 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54  );..      if( PT
11630 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
11640 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20   nOrig) ){.     
11650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11660 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11680 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
11690 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
116a0 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d  {.        nOrig-
116b0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
116c0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
116d0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
116e0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
116f0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
11700 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
11710 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
11720 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a  g)+pgsz/5)/(pgsz
11730 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20  /5);.      nFin 
11740 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
11750 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20  - nPtrmap;.     
11760 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
11770 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
11780 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49  ) && nFin<=PENDI
11790 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
117a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69  ) ){.        nFi
117b0 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n--;.      }.   
117c0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
117d0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
117e0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
117f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
11800 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46  t) ){.        nF
11810 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  in--;.      }.  
11820 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20    }..    while( 
11830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11840 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
11850 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
11860 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nFin);.    }.   
11870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11880 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73  DONE ){.      as
11890 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20  sert(nFin==0 || 
118a0 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c  pBt->nTrunc==0 |
118b0 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72  | nFin<=pBt->nTr
118c0 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  unc);.      rc =
118d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
118e0 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
118f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
11900 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
11910 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
11920 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
11930 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
11940 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11950 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  32], 0);.       
11960 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
11970 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
11980 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
11990 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69  Bt->nTrunc = nFi
119a0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
119b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
119c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
119d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
119e0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
119f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
11a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11a10 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70      *pnTrunc = p
11a20 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20  Bt->nTrunc;.    
11a30 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
11a40 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
11a50 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
11a60 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
11a70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
11a80 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
11a90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11aa0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
11ab0 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
11ac0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
11ad0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
11ae0 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
11af0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
11b00 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
11b10 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
11b20 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
11b30 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
11b40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
11b50 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
11b60 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
11b70 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
11b80 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
11b90 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
11ba0 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
11bb0 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
11bc0 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
11bd0 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
11be0 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
11bf0 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
11c00 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
11c10 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
11c20 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
11c30 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
11c40 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
11c50 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
11c60 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
11c70 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
11c80 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
11c90 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
11ca0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
11cb0 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
11cc0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
11cd0 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
11ce0 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
11cf0 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
11d00 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
11d10 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
11d20 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
11d30 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
11d40 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
11d50 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
11d60 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
11d70 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
11d80 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
11d90 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
11da0 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
11db0 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
11dc0 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
11dd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
11de0 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
11df0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
11e00 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
11e10 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11e20 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
11e30 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
11e40 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
11e50 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
11e60 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
11e70 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
11e80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11e90 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
11ea0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
11eb0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
11ec0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
11ed0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11ee0 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
11ef0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
11f00 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
11f10 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
11f20 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
11f30 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
11f40 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
11f50 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
11f60 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
11f70 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
11f80 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
11f90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11fa0 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
11fb0 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
11fc0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
11fd0 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
11fe0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
11ff0 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
12000 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12010 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
12020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12030 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12040 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
12050 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12060 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e   p->pBt;.    Pgn
12070 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  o nTrunc = 0;.  
12080 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12090 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
120a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
120b0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
120c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
120d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
120e0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
120f0 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20  t, &nTrunc); .  
12100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12120 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12130 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
12140 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12150 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
12160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12170 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
12180 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
12190 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
121a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
121b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
121c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
121d0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
121e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
121f0 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
12200 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
12210 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
12220 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
12230 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
12240 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
12250 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
12260 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
12270 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
12280 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  and should be in
12290 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  voked.** prior t
122a0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
122b0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
122c0 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
122d0 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61  routine did.** a
122e0 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
122f0 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
12300 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
12310 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
12320 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
12330 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
12340 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
12350 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
12360 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
12370 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
12380 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
12390 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
123a0 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20  urnal.** (which 
123b0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
123c0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
123d0 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73  ) and drop locks
123e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
123f0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
12400 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
12410 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
12420 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
12430 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
12440 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
12450 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
12460 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
12470 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
12480 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
12490 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
124a0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
124b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
124c0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
124d0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
124e0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
124f0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
12500 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
12510 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
12520 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
12530 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
12540 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
12550 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
12560 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
12570 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
12580 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
12590 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
125a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
125b0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
125c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
125d0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
125e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
125f0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
12600 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
12610 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12630 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12640 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
12650 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
12660 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
12670 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
12680 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53  AD;.    pBt->inS
12690 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75  tmt = 0;.  }.  u
126a0 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70  nlockAllTables(p
126b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
126c0 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b  handle has any k
126d0 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
126e0 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
126f0 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
12700 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66  on.  ** count of
12710 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
12720 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
12730 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63  ction count reac
12740 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20  hes 0, set.  ** 
12750 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
12760 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
12770 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
12780 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62  fUnused() call b
12790 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75  elow.  ** will u
127a0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
127b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
127c0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
127d0 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e  NE ){.    pBt->n
127e0 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
127f0 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
12800 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
12810 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
12820 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
12830 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NONE;.    }.  }.
12840 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61  .  /* Set the ha
12850 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72  ndles current tr
12860 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
12870 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
12880 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68  d unlock.  ** th
12890 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  e pager if this 
128a0 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
128b0 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
128c0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
128d0 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e    */.  p->inTran
128e0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
128f0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
12900 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62  nused(pBt);..  b
12910 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
12920 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12930 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12940 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12950 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
12960 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
12970 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
12980 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
12990 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
129a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
129b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
129c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
129d0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
129e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
129f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
12a00 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12a10 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29  ommitPhaseTwo(p)
12a20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
12a30 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12a40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
12a50 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
12a60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
12a70 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
12a80 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
12a90 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
12aa0 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
12ab0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
12ac0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
12ad0 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
12ae0 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
12af0 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  * defined..*/.st
12b00 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
12b10 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
12b20 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
12b30 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
12b40 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
12b50 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
12b60 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
12b70 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
12b80 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
12b90 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
12ba0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
12bb0 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  f../*.** Rollbac
12bc0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
12bd0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
12be0 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
12bf0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
12c00 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
12c10 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
12c20 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
12c30 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
12c40 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
12c50 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
12c60 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
12c70 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
12c80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
12c90 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
12ca0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
12cb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
12cc0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
12cd0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
12ce0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
12cf0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
12d00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12d10 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
12d20 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
12d30 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
12d40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
12d50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
12d60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12d70 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
12d80 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
12d90 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  Bt, 0, 0);.#ifnd
12da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12db0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
12dc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12dd0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
12de0 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74  s a horrible sit
12df0 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72  uation. An IO or
12e00 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
12e10 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20  occured whilst. 
12e20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20     ** trying to 
12e30 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69  save cursor posi
12e40 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69  tions. If this i
12e50 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72  s an automatic r
12e60 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20  ollback (as.    
12e70 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
12e80 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d   a constraint, m
12e90 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
12ea0 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65  or IO error) the
12eb0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  n .    ** the ca
12ec0 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72  che may be inter
12ed0 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
12ee0 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  nt (not contain 
12ef0 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a  valid trees) so.
12f00 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74      ** we cannot
12f10 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74   simply return t
12f20 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  he error to the 
12f30 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c  caller. Instead,
12f40 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61   abort .    ** a
12f50 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20  ll queries that 
12f60 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79  may be using any
12f70 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
12f80 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73  that failed to s
12f90 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ave..    */.    
12fa0 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 43 75 72  while( pBt->pCur
12fb0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sor ){.      sql
12fc0 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e  ite3 *db = pBt->
12fd0 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d  pCursor->pBtree-
12fe0 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20 20 20  >pSqlite;.      
12ff0 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 20 20  if( db ){.      
13000 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74    sqlite3AbortOt
13010 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28 64  herActiveVdbes(d
13020 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
13030 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13040 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
13050 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c  (p);.  unlockAll
13060 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66  Tables(p);..  if
13070 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
13080 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
13090 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64   int rc2;..#ifnd
130a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
130b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
130c0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23  t->nTrunc = 0;.#
130d0 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72  endif..    asser
130e0 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
130f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
13100 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
13110 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
13120 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
13130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
13140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13150 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
13160 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
13170 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
13180 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
13190 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
131a0 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
131b0 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65  all sqlite3Btree
131c0 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
131d0 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
131e0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
131f0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
13200 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
13210 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13220 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
13230 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
13240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13250 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
13260 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
13270 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
13280 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
13290 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
132a0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
132b0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
132c0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  }..  if( p->inTr
132d0 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
132e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
132f0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
13300 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  >0 );.    pBt->n
13310 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
13320 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
13330 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
13340 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
13350 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
13360 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NONE;.    }.  }.
13370 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
13380 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42  TRANS_NONE;.  pB
13390 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
133a0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
133b0 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
133c0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
133d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
133e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
133f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
13400 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
13410 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
13420 20 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63    The subtransac
13430 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20  tion can.** can 
13440 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  be rolled back i
13450 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
13460 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
13470 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73  tion..** You mus
13480 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
13490 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61  ction before sta
134a0 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
134b0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73  action..** The s
134c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
134d0 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
134e0 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e  ally if the main
134f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
13500 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
13510 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c   back..**.** Onl
13520 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63  y one subtransac
13530 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69  tion may be acti
13540 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49  ve at a time.  I
13550 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
13560 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74   try.** to start
13570 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61   a new subtransa
13580 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72  ction if another
13590 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
135a0 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
135b0 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  e..**.** Stateme
135c0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
135d0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
135e0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
135f0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
13600 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
13610 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
13620 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
13630 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
13640 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
13650 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
13660 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
13670 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
13680 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
13690 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
136a0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
136b0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
136c0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
136d0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
136e0 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
136f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
13700 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
13710 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13720 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13730 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 2d  er(p);.  if( (p-
13740 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
13750 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69  WRITE) || pBt->i
13760 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20  nStmt ){.    rc 
13770 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
13780 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
13790 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
137a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
137b0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
137c0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
137d0 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 72 63  _WRITE );.    rc
137e0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
137f0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
13800 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42  qlite3PagerStmtB
13810 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
13820 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  );.    pBt->inSt
13830 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  mt = 1;.  }.  sq
13840 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13850 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13860 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
13870 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73  t the statment s
13880 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  ubtransaction cu
13890 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
138a0 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73  ess.  If no.** s
138b0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
138c0 20 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73   active, this is
138d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
138e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
138f0 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70  mitStmt(Btree *p
13900 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
13910 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13920 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
13930 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13940 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74   if( pBt->inStmt
13950 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e   && !pBt->readOn
13960 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ly ){.    rc = s
13970 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
13980 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  ommit(pBt->pPage
13990 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
139a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
139b0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74  .  }.  pBt->inSt
139c0 6d 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  mt = 0;.  sqlite
139d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
139e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
139f0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
13a00 68 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  he active statem
13a10 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
13a20 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72  on.  If no subtr
13a30 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
13a40 61 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74  active this rout
13a50 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
13a60 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  **.** All cursor
13a70 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
13a80 64 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70  dated by this op
13a90 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
13aa0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20  tempt.** to use 
13ab0 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61  a cursor that wa
13ac0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
13ad0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
13ae0 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c  operation.** wil
13af0 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
13b00 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
13b10 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
13b20 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  kStmt(Btree *p){
13b30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13b40 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
13b50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
13b60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13b70 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
13b80 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77  e3MallocDisallow
13b90 28 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  ();.  if( pBt->i
13ba0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
13bb0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
13bc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13bd0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74  StmtRollback(pBt
13be0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  ->pPager);.    a
13bf0 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74  ssert( countWrit
13c00 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30  eCursors(pBt)==0
13c10 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53   );.    pBt->inS
13c20 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tmt = 0;.  }.  s
13c30 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f  qlite3MallocAllo
13c40 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  w();.  sqlite3Bt
13c50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13c60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13c70 2a 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20 63  ** Default key c
13c80 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
13c90 6f 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69 66  on to be used if
13ca0 20 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   no comparison f
13cb0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70  unction.** is sp
13cc0 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 73  ecified on the s
13cd0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
13ce0 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  r() call..*/.sta
13cf0 74 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70  tic int dfltComp
13d00 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  are(.  void *Not
13d10 55 73 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  Used,           
13d20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 69    /* User data i
13d30 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  s not used */.  
13d40 69 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f  int n1, const vo
13d50 69 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69  id *p1,    /* Fi
13d60 72 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61  rst key to compa
13d70 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20  re */.  int n2, 
13d80 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20 20  const void *p2  
13d90 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79     /* Second key
13da0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29   to compare */.)
13db0 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d  {.  int c;.  c =
13dc0 20 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20   memcmp(p1, p2, 
13dd0 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29  n1<n2 ? n1 : n2)
13de0 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  ;.  if( c==0 ){.
13df0 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b      c = n1 - n2;
13e00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b  .  }.  return c;
13e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
13e20 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
13e30 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
13e40 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
13e50 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
13e60 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71    The act of acq
13e70 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20  uiring a cursor 
13e80 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  gets a read lock
13e90 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61   on .** the data
13ea0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
13eb0 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
13ec0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
13ed0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
13ee0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
13ef0 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
13f00 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
13f10 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
13f20 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
13f30 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
13f40 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
13f50 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
13f60 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
13f70 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
13f80 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
13f90 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
13fa0 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
13fb0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
13fc0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
13fd0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
13fe0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
13ff0 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
14000 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
14010 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
14020 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
14030 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
14040 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
14050 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
14060 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
14070 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
14080 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
14090 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
140a0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
140b0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
140c0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
140d0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
140e0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
140f0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
14100 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
14110 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
14120 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
14130 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
14140 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
14150 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
14160 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
14170 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
14180 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
14190 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
141a0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
141b0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
141c0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
141d0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
141e0 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
141f0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
14200 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
14210 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
14220 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
14230 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
14240 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
14250 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73  .** The comparis
14260 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  on function must
14270 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68   be logically th
14280 65 20 73 61 6d 65 20 66 6f 72 20 65 76 65 72 79  e same for every
14290 20 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20   cursor.** on a 
142a0 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
142b0 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  .  Changing the 
142c0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
142d0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
142e0 2a 2a 20 69 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** in incorrect 
142f0 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 66 20  operations.  If 
14300 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
14310 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
14320 20 61 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f   a.** default co
14330 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
14340 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68 65 20  n is used.  The 
14350 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
14360 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73  ion is.** always
14370 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54   ignored for INT
14380 4b 45 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  KEY tables..*/.s
14390 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
143a0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
143b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
143e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
143f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
14420 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
14430 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
14440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
14470 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
14480 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f    int (*xCmp)(vo
14490 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
144a0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
144b0 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d  id*), /* Key Com
144c0 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a  parison func */.
144d0 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20    void *pArg,   
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14500 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
14510 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
14520 43 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20 20  Cursor **ppCur  
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
14550 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
14560 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
14570 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
14580 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  Cur;.  BtShared 
14590 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
145a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
145b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
145c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2a 70  ->mutex) );.  *p
145d0 70 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  pCur = 0;.  if( 
145e0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66  wrFlag ){.    if
145f0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
14600 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14610 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
14620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
14630 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
14640 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20   iTable, 0) ){. 
14650 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14660 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  TE_LOCKED;.    }
14670 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d  .  }..  if( pBt-
14680 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
14690 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
146a0 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20  WithRetry(p);.  
146b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
146c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
146d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
146e0 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
146f0 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b  nly && wrFlag ){
14700 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14710 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
14720 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 20     }.  }.  pCur 
14730 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
14740 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 43 75  ero( sizeof(*pCu
14750 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
14760 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
14770 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14780 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
14790 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
147a0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
147b0 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
147c0 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  ble;.  if( iTabl
147d0 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50  e==1 && sqlite3P
147e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
147f0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  t->pPager)==0 ){
14800 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14810 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
14820 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
14830 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
14840 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
14850 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
14860 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
14870 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
14880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14890 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
148a0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
148b0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  on;.  }..  /* No
148c0 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
148d0 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
148e0 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
148f0 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
14900 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c  .  ** variables,
14910 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
14920 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
14930 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20  ed list and set 
14940 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a  *ppCur (the.  **
14950 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74   output argument
14960 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
14970 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  n)..  */.  pCur-
14980 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70  >xCompare = xCmp
14990 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f   ? xCmp : dfltCo
149a0 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70  mpare;.  pCur->p
149b0 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43  Arg = pArg;.  pC
149c0 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
149d0 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
149e0 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d   wrFlag;.  pCur-
149f0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
14a00 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
14a10 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
14a20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
14a30 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
14a40 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
14a50 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
14a60 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
14a70 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72 20  VALID;.  *ppCur 
14a80 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75 72  = pCur;..  retur
14a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72  n SQLITE_OK;..cr
14aa0 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
14ab0 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75  ption:.  if( pCu
14ac0 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  r ){.    release
14ad0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
14ae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14af0 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ree(pCur);.  }. 
14b00 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
14b10 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74  used(pBt);.  ret
14b20 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
14b30 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
14b40 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
14b80 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14bb0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
14bc0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
14bd0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c00 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
14c10 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ad-only */.  int
14c20 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69   (*xCmp)(void*,i
14c30 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
14c40 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
14c50 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73   /* Key Comparis
14c60 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69  on func */.  voi
14c70 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  d *pArg,        
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
14ca0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
14cb0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
14cc0 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20  r **ppCur       
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
14cf0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
14d00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
14d10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14d20 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
14d30 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
14d40 6c 65 2c 20 77 72 46 6c 61 67 2c 20 78 43 6d 70  le, wrFlag, xCmp
14d50 2c 20 70 41 72 67 2c 20 70 70 43 75 72 29 3b 0a  , pArg, ppCur);.
14d60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14d70 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
14d80 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
14d90 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
14da0 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
14db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14dc0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
14dd0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
14de0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
14df0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14e00 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
14e10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
14e20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
14e30 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
14e40 2d 3e 70 42 74 3b 0a 0a 20 20 63 75 72 73 6f 72  ->pBt;..  cursor
14e50 45 6e 74 65 72 28 70 43 75 72 29 3b 0a 20 20 63  Enter(pCur);.  c
14e60 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
14e70 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
14e80 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
14e90 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
14ea0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
14eb0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
14ec0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
14ed0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
14ee0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  }.  if( pCur->pN
14ef0 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
14f00 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
14f10 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d  pCur->pPrev;.  }
14f20 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
14f30 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75  Cur->pPage);.  u
14f40 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
14f50 65 64 28 70 42 74 29 3b 0a 20 20 69 6e 76 61 6c  ed(pBt);.  inval
14f60 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
14f70 68 65 28 70 43 75 72 29 3b 0a 20 20 63 75 72 73  he(pCur);.  curs
14f80 6f 72 4c 65 61 76 65 28 70 43 75 72 29 3b 0a 20  orLeave(pCur);. 
14f90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
14fa0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ur);.  return SQ
14fb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14fc0 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61  * Make a tempora
14fd0 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c  ry cursor by fil
14fe0 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c  ling in the fiel
14ff0 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a  ds of pTempCur..
15000 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ** The temporary
15010 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f   cursor is not o
15020 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73  n the cursor lis
15030 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e  t for the Btree.
15040 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15050 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
15060 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
15070 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65  r, BtCursor *pTe
15080 6d 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70 79  mpCur){.  memcpy
15090 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c  (pTempCur, pCur,
150a0 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b   sizeof(*pCur));
150b0 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65  .  pTempCur->pNe
150c0 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43  xt = 0;.  pTempC
150d0 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  ur->pPrev = 0;. 
150e0 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70   if( pTempCur->p
150f0 50 61 67 65 20 29 7b 0a 20 20 20 20 63 75 72 73  Page ){.    curs
15100 6f 72 45 6e 74 65 72 28 70 43 75 72 29 3b 0a 20  orEnter(pCur);. 
15110 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
15120 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  ef(pTempCur->pPa
15130 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
15140 20 20 63 75 72 73 6f 72 4c 65 61 76 65 28 70 43    cursorLeave(pC
15150 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
15160 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f  * Delete a tempo
15170 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68  rary cursor such
15180 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20   as was made by 
15190 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72  the CreateTempor
151a0 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66  aryCursor().** f
151b0 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a  unction above..*
151c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
151d0 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
151e0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
151f0 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
15200 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 63  ->pPage ){.    c
15210 75 72 73 6f 72 45 6e 74 65 72 28 70 43 75 72 29  ursorEnter(pCur)
15220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
15230 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
15240 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
15250 20 20 20 63 75 72 73 6f 72 4c 65 61 76 65 28 70     cursorLeave(p
15260 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
15270 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
15280 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
15290 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
152a0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
152b0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
152c0 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
152d0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
152e0 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71  alid, call.** sq
152f0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15300 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
15310 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
15320 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
15330 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
15340 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
15350 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
15360 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
15370 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
15380 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73  er of calls to s
15390 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
153a0 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
153b0 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
153c0 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
153d0 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
153e0 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
153f0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
15400 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
15410 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
15420 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
15430 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
15440 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
15450 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
15460 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
15470 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
15480 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
15490 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
154a0 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
154b0 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
154c0 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
154d0 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
154e0 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
154f0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
15500 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
15510 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
15520 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
15530 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
15540 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
15550 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
15560 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
15570 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
15580 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
15590 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d  Info info;.    m
155a0 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
155b0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
155c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
155d0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
155e0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
155f0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
15600 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
15610 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
15620 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
15630 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
15640 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
15650 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
15660 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
15670 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
15680 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
15690 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
156a0 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
156b0 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
156c0 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
156d0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
156e0 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
156f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
15700 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
15710 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15720 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
15730 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e  ur->idx, &pCur->
15740 69 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  info);.    }else
15750 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
15760 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
15770 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
15780 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
15790 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
157a0 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
157b0 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
157c0 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
157d0 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
157e0 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
157f0 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
15830 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
15840 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   \.    sqlite3Bt
15880 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
15890 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
158a0 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  idx, &pCur->info
158b0 29 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d  );         \.  }
158c0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
15910 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15950 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
15960 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
15970 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
15980 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
15990 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
159a0 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
159b0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
159c0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
159d0 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
159e0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
159f0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
15a00 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
15a10 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
15a20 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
15a30 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
15a40 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
15a50 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
15a60 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
15a70 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
15a80 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
15a90 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
15aa0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
15ab0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
15ac0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
15ad0 69 6e 74 20 72 63 3b 0a 0a 20 20 73 71 6c 69 74  int rc;..  sqlit
15ae0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 43 75  e3BtreeEnter(pCu
15af0 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 63  r->pBtree);.  rc
15b00 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
15b10 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
15b20 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
15b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15b40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
15b50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
15b60 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
15b70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
15b80 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
15b90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
15ba0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
15bb0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
15bc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15bd0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
15be0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
15bf0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
15c00 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
15c10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15c20 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ave(pCur->pBtree
15c30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15c40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
15c50 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
15c60 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
15c70 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
15c80 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
15c90 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
15ca0 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  o.  Always retur
15cb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
15cc0 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
15cd0 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65  ossible.  If the
15ce0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63   cursor is not c
15cf0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
15d00 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79  ting to an entry
15d10 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70   (which can happ
15d20 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
15d30 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   if.** the datab
15d40 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68  ase is empty) th
15d50 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  en *pSize is set
15d60 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
15d70 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
15d80 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
15d90 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
15da0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 71 6c    int rc;..  sql
15db0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15dc0 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
15dd0 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
15de0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
15df0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
15e00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15e10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
15e20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
15e30 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
15e40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
15e50 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
15e60 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
15e70 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
15e80 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  {.      /* Not p
15e90 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
15ea0 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
15eb0 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
15ec0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
15ed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15ee0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
15ef0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
15f00 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
15f10 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
15f20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15f30 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ave(pCur->pBtree
15f40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15f50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
15f60 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15f70 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
15f80 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
15f90 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
15fa0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
15fb0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
15fc0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
15fd0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15fe0 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
15ff0 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
16000 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
16010 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
16020 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
16030 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
16040 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
16050 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
16060 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
16070 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
16080 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
16090 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
160a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
160b0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
160c0 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e  ** Unless pPgnoN
160d0 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ext is NULL, the
160e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
160f0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
16100 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  w .** page in th
16110 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
16120 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
16130 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
16140 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c  ovfl.** is the l
16150 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 27 73  ast page in it's
16160 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70   linked list, *p
16170 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
16180 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
16190 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
161a0 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69   NULL, *ppPage i
161b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65 6d  s set to the Mem
161c0 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20  Page* handle.** 
161d0 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20 54  for page ovfl. T
161e0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70 61  he underlying pa
161f0 67 65 72 20 70 61 67 65 20 6d 61 79 20 68 61 76  ger page may hav
16200 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
16210 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f 43  .** with the noC
16220 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74 2c  ontent flag set,
16230 20 73 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   so the page dat
16240 61 20 61 63 63 65 73 73 61 62 6c 65 20 76 69 61  a accessable via
16250 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 20  .** this handle 
16260 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
16270 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16280 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
16290 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
162a0 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  Bt, .  Pgno ovfl
162b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
162c0 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20      /* Overflow 
162d0 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
162e0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
162f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
16300 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f  emPage handle */
16310 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
16320 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
16330 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
16340 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
16350 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
16360 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ext = 0;.  int r
16370 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
16380 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16390 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
163a0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73    /* One of thes
163b0 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e 55  e must not be NU
163c0 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 77  LL. Otherwise, w
163d0 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  hy call this fun
163e0 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65  ction? */.  asse
163f0 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70 50 67  rt(ppPage || pPg
16400 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49  noNext);..  /* I
16410 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e  f pPgnoNext is N
16420 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
16430 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
16440 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
16450 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65  n.  ** a MemPage
16460 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  * reference only
16470 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20 69  . No page-data i
16480 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
16490 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  is case..  */.  
164a0 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74 20 29  if( !pPgnoNext )
164b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
164c0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
164d0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61  (pBt, ovfl, ppPa
164e0 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66  ge, 1);.  }..#if
164f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16500 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
16510 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
16520 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
16530 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
16540 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
16550 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
16560 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
16570 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
16580 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
16590 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
165a0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
165b0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
165c0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
165d0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
165e0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
165f0 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
16600 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
16610 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
16620 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
16630 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
16640 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
16650 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
16660 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
16670 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
16680 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
16690 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
166a0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
166b0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
166c0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
166d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
166e0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
166f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
16700 69 47 75 65 73 73 3c 3d 73 71 6c 69 74 65 33 50  iGuess<=sqlite3P
16710 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
16720 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
16730 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
16740 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
16750 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
16760 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16780 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16790 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
167a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
167b0 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
167c0 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
167d0 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
167e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
167f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
16800 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67  next==0 || ppPag
16810 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  e ){.    MemPage
16820 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
16830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
16840 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
16850 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65  ovfl, &pPage, ne
16860 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65  xt!=0);.    asse
16870 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
16880 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20   || pPage==0);. 
16890 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26     if( next==0 &
168a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
168b0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
168c0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
168d0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20  aData);.    }.. 
168e0 20 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b     if( ppPage ){
168f0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
16900 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73   pPage;.    }els
16910 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e{.      release
16920 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
16930 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e   }.  }.  *pPgnoN
16940 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72  ext = next;..  r
16950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16960 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
16970 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
16980 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
16990 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
169a0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
169b0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
169c0 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
169d0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
169e0 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
169f0 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
16a00 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
16a10 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
16a20 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
16a30 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
16a40 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
16a50 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
16a60 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
16a70 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
16a80 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
16a90 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
16aa0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
16ab0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
16ac0 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
16ad0 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
16ae0 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
16af0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
16b00 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
16b10 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
16b20 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
16b30 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
16b40 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
16b50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
16b60 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
16b70 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
16b80 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
16b90 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
16ba0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
16bb0 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
16bc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16bd0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
16be0 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
16c10 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
16c20 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
16c30 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
16c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
16c50 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
16c60 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
16c70 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
16c80 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
16c90 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
16ca0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
16cb0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
16cc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16cd0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
16ce0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
16d00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16d10 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
16d20 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
16d30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
16d40 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
16d50 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
16d60 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
16d70 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
16d80 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
16d90 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
16da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16db0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
16dc0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
16dd0 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
16de0 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
16df0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
16e00 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
16e10 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
16e20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66   pointing to. If
16e30 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61   the eOp.** para
16e40 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73  meter is 0, this
16e50 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
16e60 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65  tion (data copie
16e70 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72  d into.** buffer
16e80 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73   pBuf). If it is
16e90 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69   non-zero, a wri
16ea0 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  te (data copied 
16eb0 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70  from.** buffer p
16ec0 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  Buf)..**.** A to
16ed0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
16ee0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
16ef0 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
16f00 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
16f10 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
16f20 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
16f30 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
16f40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
16f50 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73  s not make a dis
16f60 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e  tinction between
16f70 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a   key and data..*
16f80 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73 20  * It just reads 
16f90 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73 20  or writes bytes 
16fa0 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64  from the payload
16fb0 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67   area.  Data mig
16fc0 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e  ht .** appear on
16fd0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f   the main page o
16fe0 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
16ff0 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
17000 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65  verflow .** page
17010 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
17020 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62  BtCursor.isIncrb
17030 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
17040 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63  s set, and the c
17050 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72  urrent.** cursor
17060 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
17070 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
17080 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e   pages, this fun
17090 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74  ction.** allocat
170a0 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  es space for and
170b0 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65   lazily popluate
170c0 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
170d0 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63  age-list .** cac
170e0 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
170f0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53  or.aOverflow). S
17100 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
17110 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68  use this.** cach
17120 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
17130 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
17140 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66  d offset more ef
17150 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
17160 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
17170 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
17180 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
17190 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
171a0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
171b0 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
171c0 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
171d0 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
171e0 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
171f0 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
17200 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
17210 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
17220 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
17230 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
17240 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
17250 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
17260 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
17270 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
17280 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
17290 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
172a0 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
172b0 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
172c0 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
172d0 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
172e0 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
172f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
17300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
17310 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
17320 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
17330 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
17340 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
17350 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
17360 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20    int offset,   
17370 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
17380 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
17390 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
173a0 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
173b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
173c0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
173d0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
173e0 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
173f0 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
17400 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
17410 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c   .  int skipKey,
17420 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73           /* offs
17430 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74  et begins at dat
17440 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
17450 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20  e */.  int eOp  
17460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
17470 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
17480 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
17490 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
174a0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
174b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
174c0 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
174d0 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
174e0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
174f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
17500 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72  e;        /* Btr
17510 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
17520 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
17530 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
17540 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
17550 65 2d 3e 70 42 74 3b 20 20 20 2f 2a 20 42 74 72  e->pBt;   /* Btr
17560 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
17570 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
17580 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
17590 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
175a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
175b0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
175c0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
175d0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
175e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
175f0 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
17600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
17610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17620 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
17630 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
17640 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
17650 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
17660 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
17670 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
17680 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
17690 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
176a0 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f  ? 0 : pCur->info
176b0 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73  .nKey);..  if( s
176c0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66  kipKey ){.    of
176d0 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  fset += nKey;.  
176e0 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61  }.  if( offset+a
176f0 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
17700 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20  info.nData ){.  
17710 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
17720 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
17730 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
17740 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
17750 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
17760 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17770 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
17780 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
17790 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
177a0 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
177b0 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
177c0 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
177d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
177e0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
177f0 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
17800 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
17810 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
17820 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
17830 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
17840 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
17850 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
17860 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
17870 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
17880 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
17890 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
178a0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
178b0 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
178c0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
178d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
178e0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
178f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
17900 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  0 ){.    const i
17910 6e 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  nt ovflSize = pB
17920 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
17930 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
17940 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
17950 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
17960 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
17970 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
17980 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
17990 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
179a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
179b0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
179c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
179d0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
179e0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
179f0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
17a00 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
17a10 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
17a20 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
17a30 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
17a40 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
17a50 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
17a60 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
17a70 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
17a80 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
17a90 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
17aa0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
17ab0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
17ac0 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
17ad0 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
17ae0 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
17af0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
17b00 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
17b10 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
17b20 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
17b30 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
17b40 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
17b50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
17b60 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
17b70 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
17b80 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
17b90 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
17ba0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
17bb0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
17bc0 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
17bd0 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
17be0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
17bf0 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
17c00 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
17c10 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
17c20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21    if( nOvfl && !
17c30 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
17c40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
17c50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17c60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
17c70 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
17c80 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
17c90 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
17ca0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
17cb0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
17cc0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
17cd0 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
17ce0 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
17cf0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
17d00 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
17d10 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
17d20 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
17d30 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
17d40 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
17d50 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
17d60 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
17d70 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
17d80 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
17d90 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
17da0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
17db0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
17dc0 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
17dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17de0 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
17df0 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
17e00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17e10 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
17e20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
17e30 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
17e40 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
17e50 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
17e60 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
17e70 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
17e80 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
17e90 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
17ea0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
17eb0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
17ec0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
17ed0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
17ee0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
17ef0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
17f00 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
17f10 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
17f20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
17f30 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
17f40 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
17f50 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
17f60 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
17f70 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
17f80 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
17f90 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
17fa0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
17fb0 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
17fc0 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
17fd0 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
17fe0 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
17ff0 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
18000 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
18010 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
18020 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
18030 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
18040 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
18050 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18060 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
18070 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
18080 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
18090 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
180a0 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
180b0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
180c0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
180d0 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
180e0 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
180f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
18100 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
18110 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
18120 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
18130 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
18140 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
18150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
18160 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
18170 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
18180 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
18190 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
181a0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
181b0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
181c0 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
181d0 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
181e0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
181f0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
18200 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  bPage;.        i
18210 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
18220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18230 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
18240 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
18250 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
18260 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18280 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
18290 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
182a0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
182b0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
182c0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
182d0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
182e0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
182f0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
18300 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
18310 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
18320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18330 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
18340 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
18350 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
18360 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
18370 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18380 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
18390 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
183a0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
183b0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
183c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66  ;.          pBuf
183d0 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d   += a;.        }
183e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
183f0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
18400 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
18410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18420 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18430 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
18440 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18450 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
18460 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
18470 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
18480 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
18490 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
184a0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
184b0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
184c0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
184d0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
184e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
184f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
18500 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
18510 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
18520 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
18530 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
18540 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
18550 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
18560 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
18570 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
18580 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
18590 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
185a0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
185b0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
185c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
185d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
185e0 72 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b  r(pCur->pBtree);
185f0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
18600 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
18610 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
18620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18630 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18640 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18650 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
18660 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18670 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
18680 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
18690 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
186a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
186b0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b  e(pCur->pBtree);
186c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
186d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
186e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
186f0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
18700 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
18710 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18720 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
18730 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
18740 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
18750 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
18760 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
18770 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
18780 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29  har*)pBuf, 0, 0)
18790 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
187a0 74 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e  treeLeave(pCur->
187b0 70 42 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72  pBtree);.  retur
187c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
187d0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
187e0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
187f0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
18800 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
18810 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
18820 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
18830 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
18840 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
18850 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
18860 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18870 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18880 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
18890 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
188a0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
188b0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
188c0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
188d0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
188e0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
188f0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
18900 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
18910 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
18920 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
18930 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
18940 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
18950 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18960 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65  nter(pCur->pBtre
18970 65 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f  e);.  rc = resto
18980 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
18990 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
189a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
189b0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
189c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
189d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
189e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
189f0 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
18a00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18a10 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
18a20 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
18a30 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
18a40 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
18a50 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
18a60 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b  mt, pBuf, 1, 0);
18a70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
18a80 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70  reeLeave(pCur->p
18a90 42 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e  Btree);.  return
18aa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18ab0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18ac0 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
18ad0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
18ae0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
18af0 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
18b00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
18b10 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
18b20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
18b30 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
18b40 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
18b50 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
18b60 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
18b70 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
18b80 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
18b90 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
18ba0 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
18bb0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
18bc0 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
18bd0 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
18be0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
18bf0 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
18c00 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
18c10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18c20 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
18c30 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
18c40 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
18c50 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
18c60 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
18c70 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
18c80 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
18c90 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
18ca0 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
18cb0 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
18cc0 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
18cd0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
18ce0 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
18cf0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
18d00 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
18d10 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
18d20 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
18d30 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
18d40 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
18d50 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
18d60 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20  o reassembly.** 
18d70 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
18d80 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
18d90 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
18da0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
18db0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
18dc0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
18dd0 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
18de0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
18df0 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
18e00 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
18e10 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
18e20 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
18e30 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
18e40 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
18e50 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
18e60 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
18e70 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
18e80 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
18e90 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
18ea0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
18eb0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
18ec0 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
18ed0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
18ee0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
18ef0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
18f00 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
18f10 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
18f20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
18f30 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
18f40 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
18f50 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
18f60 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
18f70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
18f80 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
18f90 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
18fa0 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
18fb0 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
18fc0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18fd0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18fe0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
18ff0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19000 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
19010 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ee->pBt->mutex) 
19020 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
19030 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
19040 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
19050 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
19060 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
19070 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
19080 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
19090 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
190a0 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
190b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
190c0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
190d0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
190e0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
190f0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75  {.    nKey = pCu
19100 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
19110 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
19120 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
19130 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
19140 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
19150 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
19160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
19170 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
19180 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
19190 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
191a0 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
191b0 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
191c0 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
191d0 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
191e0 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
191f0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
19200 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
19210 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
19220 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
19230 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
19240 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
19250 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
19260 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
19270 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
19280 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
19290 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
192a0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
192b0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
192c0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
192d0 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
192e0 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
192f0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
19300 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
19310 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
19320 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
19330 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
19340 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
19350 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
19360 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
19370 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
19380 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
19390 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
193a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
193b0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
193c0 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
193d0 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
193e0 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
193f0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
19400 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
19410 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
19420 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
19430 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
19440 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
19450 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
19460 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
19470 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19480 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
19490 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
194a0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
194b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
194c0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
194d0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
194e0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
194f0 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
19500 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e   return 0;.}.con
19510 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
19520 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
19530 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
19540 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
19550 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19560 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
19570 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  tree->pBt->mutex
19580 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
19590 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
195a0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
195b0 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
195c0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
195d0 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
195e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
195f0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
19600 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
19610 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
19620 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
19630 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
19640 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
19650 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
19660 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
19670 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19680 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
19690 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
196a0 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
196b0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
196c0 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  e;.  MemPage *pO
196d0 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ldPage;.  BtShar
196e0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
196f0 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20  pBtree->pBt;..  
19700 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19710 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
19720 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
19730 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
19740 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19750 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ;.  rc = getAndI
19760 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
19770 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c  Pgno, &pNewPage,
19780 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
19790 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
197a0 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d   rc;.  pNewPage-
197b0 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43 75  >idxParent = pCu
197c0 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61  r->idx;.  pOldPa
197d0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
197e0 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64  ;.  pOldPage->id
197f0 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65  xShift = 0;.  re
19800 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50 61  leasePage(pOldPa
19810 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
19820 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  ge = pNewPage;. 
19830 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
19840 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
19850 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ze = 0;.  if( pN
19860 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
19870 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19880 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19890 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
198a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
198b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
198c0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74  if the page is t
198d0 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
198e0 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a  of its table..**
198f0 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20  .** The virtual 
19900 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65  root page is the
19910 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 6d   root page for m
19920 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75 74  ost tables.  But
19930 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c  .** for the tabl
19940 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65  e rooted on page
19950 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68 65   1, sometime the
19960 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a   real root page.
19970 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63 65  ** is empty exce
19980 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  pt for the right
19990 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73 75  -pointer.  In su
199a0 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a 20  ch cases the.** 
199b0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
199c0 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  e is the page th
199d0 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  at the right-poi
199e0 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20  nter of page.** 
199f0 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  1 is pointing to
19a00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19a10 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28  BtreeIsRootPage(
19a20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
19a30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
19a40 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ent;..  assert( 
19a50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19a60 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
19a70 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 72 65  utex) );.  pPare
19a80 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
19a90 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65  ent;.  if( pPare
19aa0 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  nt==0 ) return 1
19ab0 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d  ;.  if( pParent-
19ac0 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e  >pgno>1 ) return
19ad0 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79   0;.  if( get2by
19ae0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
19af0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
19b00 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72  ffset+3])==0 ) r
19b10 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
19b20 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  n 0;.}../*.** Mo
19b30 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
19b40 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
19b50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
19b60 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
19b70 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
19b80 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
19b90 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
19ba0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
19bb0 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
19bc0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
19bd0 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
19be0 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
19bf0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
19c00 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
19c10 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
19c20 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
19c30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19c40 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
19c50 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
19c60 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
19c70 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65  arent;.  MemPage
19c80 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
19c90 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 73 71 6c  dxParent;..  sql
19ca0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19cb0 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
19cc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
19cd0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19ce0 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  ID );.  pPage = 
19cf0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
19d00 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
19d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  );.  assert( !sq
19d20 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
19d30 50 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20  Page(pPage) );. 
19d40 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65   pParent = pPage
19d50 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73  ->pParent;.  ass
19d60 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20  ert( pParent!=0 
19d70 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d  );.  idxParent =
19d80 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
19d90 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
19da0 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
19db0 62 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  bPage);.  releas
19dc0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
19dd0 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50  pCur->pPage = pP
19de0 61 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69  arent;.  pCur->i
19df0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
19e00 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
19e10 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b  ->idxShift==0 );
19e20 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69  .  pCur->idx = i
19e30 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69  dxParent;.  sqli
19e40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 43  te3BtreeLeave(pC
19e50 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 7d 0a 0a  ur->pBtree);.}..
19e60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19e70 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
19e80 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
19e90 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
19ea0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
19eb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
19ec0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
19ed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
19ee0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
19ef0 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
19f00 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
19f10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19f20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
19f30 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29  Sqlite->mutex) )
19f40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
19f50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19f60 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
19f70 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
19f80 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  ==CURSOR_REQUIRE
19f90 53 45 45 4b 20 29 7b 0a 20 20 20 20 63 6c 65 61  SEEK ){.    clea
19fa0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
19fb0 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f  pCur);.  }.  pRo
19fc0 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
19fd0 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 20 26 26  ;.  if( pRoot &&
19fe0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
19ff0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ur->pgnoRoot ){.
1a000 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1a010 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d  t->isInit );.  }
1a020 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20  else{.    if( . 
1a030 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d       SQLITE_OK!=
1a040 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74  (rc = getAndInit
1a050 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
1a060 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
1a070 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 0)).    ){.   
1a080 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1a090 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1a0a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a0b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  c;.    }.    rel
1a0c0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
1a0d0 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
1a0e0 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a  >pPage = pRoot;.
1a0f0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20    }.  pCur->idx 
1a100 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
1a110 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
1a120 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d  f( pRoot->nCell=
1a130 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65  =0 && !pRoot->le
1a140 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
1a150 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65  ubpage;.    asse
1a160 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
1a170 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67  =1 );.    subpag
1a180 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
1a190 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
1a1a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1a1b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62  .    assert( sub
1a1c0 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43  page>0 );.    pC
1a1d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1a1e0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
1a1f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1a200 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
1a210 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
1a220 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61  te = ((pCur->pPa
1a230 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52  ge->nCell>0)?CUR
1a240 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52  SOR_VALID:CURSOR
1a250 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74  _INVALID);.  ret
1a260 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a270 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1a280 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
1a290 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
1a2a0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
1a2b0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1a2c0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
1a2d0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
1a2e0 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
1a2f0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
1a300 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
1a310 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
1a320 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
1a330 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1a340 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
1a350 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
1a360 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
1a370 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a380 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
1a390 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1a3a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a3b0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1a3c0 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  tree->pBt->mutex
1a3d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1a3e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a3f0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1a400 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
1a410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a420 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a430 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1a440 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1a450 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1a460 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1a470 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1a480 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1a490 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
1a4a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1a4b0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1a4c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1a4d0 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20  Cur->idx));.    
1a4e0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1a4f0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1a500 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a510 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a520 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a530 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
1a540 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1a550 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
1a560 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1a570 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1a580 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
1a590 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
1a5a0 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
1a5b0 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
1a5c0 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
1a5d0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
1a5e0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
1a5f0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1a600 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
1a610 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
1a620 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1a630 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1a640 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a650 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
1a660 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
1a670 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
1a680 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
1a690 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
1a6a0 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
1a6b0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1a6c0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1a6d0 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
1a6e0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1a6f0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1a700 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1a710 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1a720 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a730 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1a740 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  r->pBtree->pBt->
1a750 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a760 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1a770 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1a780 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  ree->pSqlite->mu
1a790 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1a7a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a7b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1a7c0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1a7d0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
1a7e0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
1a7f0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1a800 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1a810 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1a820 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1a830 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20  ;.    pCur->idx 
1a840 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1a850 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1a860 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1a870 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1a880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a890 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1a8a0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20  ge->nCell - 1;. 
1a8b0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1a8c0 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ize = 0;.  }.  r
1a8d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a8e0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1a8f0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1a900 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1a910 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1a920 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1a930 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1a940 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1a950 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1a960 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1a970 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1a980 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1a990 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1a9a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a9b0 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1a9c0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1a9d0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
1a9e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a9f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1aa00 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  r->pBtree->pBt->
1aa10 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1aa20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1aa30 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1aa40 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  ree->pSqlite->mu
1aa50 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1aa60 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1aa70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1aa80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1aa90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1aaa0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1aab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1aac0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1aad0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1aae0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
1aaf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ab00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1ab10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1ab20 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
1ab30 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1ab40 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1ab50 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1ab60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ab70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
1ab80 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1ab90 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1aba0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
1abb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
1abc0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
1abd0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
1abe0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
1abf0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
1ac00 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
1ac10 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
1ac20 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1ac30 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1ac40 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
1ac50 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1ac60 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1ac70 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
1ac80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1ac90 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1aca0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1acb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1acc0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1acd0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
1ace0 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
1acf0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1ad00 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1ad10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ad20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1ad30 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1ad40 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
1ad50 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
1ad60 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1ad70 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1ad80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1ad90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1ada0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1adb0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
1adc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1add0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1ade0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1adf0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ae00 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1ae10 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1ae20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1ae30 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65  ry near pKey/nKe
1ae40 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  y..** Return a s
1ae50 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1ae60 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1ae70 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  bles, only the n
1ae80 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1ae90 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
1aea0 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
1aeb0 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e   other tables, n
1aec0 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Key is the numbe
1aed0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1aee0 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20  ta.** in pKey.  
1aef0 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
1af00 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  unction specifie
1af10 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  d when the curso
1af20 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64  r was.** created
1af30 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
1af40 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  are keys..**.** 
1af50 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
1af60 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
1af70 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1af80 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
1af90 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1afa0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1afb0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
1afc0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
1afd0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
1afe0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
1aff0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
1b000 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
1b010 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
1b020 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1b030 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1b040 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1b050 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1b060 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73  hich the.** curs
1b070 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  or is written to
1b080 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21 3d   *pRes if pRes!=
1b090 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69  NULL.  The meani
1b0a0 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61  ng of.** this va
1b0b0 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  lue is as follow
1b0c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
1b0d0 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
1b0e0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1b0f0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1b100 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1b110 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
1b120 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20  aller than pKey 
1b130 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1b140 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1b160 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1b170 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1b180 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1b190 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1b1a0 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1b1b0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1b1c0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1b1d0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1b1e0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1b1f0 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a  matches pKey..**
1b200 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
1b210 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1b220 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1b230 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1b240 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b250 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
1b260 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f  than pKey..**.*/
1b270 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b280 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
1b290 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1b2a0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1b2b0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
1b2c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1b2d0 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b  y,      /* The k
1b2e0 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69  ey content for i
1b2f0 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20 75 73 65  ndices.  Not use
1b300 64 20 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  d by tables */. 
1b310 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
1b320 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b330 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68 65  of pKey.  Or the
1b340 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 20   key for tables 
1b350 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
1b360 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ht,         /* I
1b370 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
1b380 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
1b390 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
1b3a0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
1b3b0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72 65      /* Search re
1b3c0 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a  sult flag */.){.
1b3d0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1b3e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b3f0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1b400 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  tree->pBt->mutex
1b410 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1b420 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b430 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1b440 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
1b450 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
1b460 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
1b470 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1b480 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1b490 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1b4a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1b4b0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69  ur->pPage->isIni
1b4c0 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  t );.  if( pCur-
1b4d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1b4e0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
1b4f0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
1b500 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1b510 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1b520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b530 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  E_OK;.  }.  for(
1b540 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
1b550 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
1b560 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
1b570 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1b580 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e  r->pPage;.    in
1b590 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52  t c = -1;  /* pR
1b5a0 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62  es return if tab
1b5b0 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74  le is empty must
1b5c0 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77   be -1 */.    lw
1b5d0 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
1b5e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
1b5f0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1b600 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65 79 3d  >intKey && pKey=
1b610 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1b620 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1b630 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1b640 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
1b650 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  ){.      pCur->i
1b660 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65  dx = upr;.    }e
1b670 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
1b680 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29  >idx = (upr+lwr)
1b690 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  /2;.    }.    if
1b6a0 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72  ( lwr<=upr ) for
1b6b0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  (;;){.      void
1b6c0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
1b6d0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
1b6e0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1b6f0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1b700 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1b710 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Key ){.        u
1b720 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
1b730 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
1b740 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1b750 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
1b760 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
1b770 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
1b780 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
1b790 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
1b7a0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
1b7b0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
1b7c0 65 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  ell, &dummy);.  
1b7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b7e0 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
1b7f0 20 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b 65   (u64 *)&nCellKe
1b800 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
1b810 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b  nCellKey<nKey ){
1b820 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
1b830 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1b840 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b   if( nCellKey>nK
1b850 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1b860 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1b870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b880 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
1b890 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1b8a0 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c         int avail
1b8b0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43  able;.        pC
1b8c0 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a  ellKey = (void *
1b8d0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1b8e0 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20  ur, &available, 
1b8f0 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  0);.        nCel
1b900 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  lKey = pCur->inf
1b910 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
1b920 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e  if( available>=n
1b930 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20  CellKey ){.     
1b940 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78       c = pCur->x
1b950 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41  Compare(pCur->pA
1b960 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  rg, nCellKey, pC
1b970 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b  ellKey, nKey, pK
1b980 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
1b990 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
1b9a0 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
1b9b0 5f 6d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65  _malloc( nCellKe
1b9c0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  y );.          i
1b9d0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
1b9e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1b9f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
1ba00 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ba10 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43  eKey(pCur, 0, nC
1ba20 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29  ellKey, (void *)
1ba30 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
1ba40 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78       c = pCur->x
1ba50 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41  Compare(pCur->pA
1ba60 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  rg, nCellKey, pC
1ba70 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b  ellKey, nKey, pK
1ba80 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
1ba90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
1baa0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1bab0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1bac0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1bad0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1bae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1baf0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
1bb00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1bb10 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
1bb20 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1bb30 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
1bb40 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20   pCur->idx;.    
1bb50 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20        upr = lwr 
1bb60 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  - 1;.          b
1bb70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1bb80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1bb90 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20  f( pRes ) *pRes 
1bba0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
1bbb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bbc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bbd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
1bbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
1bbf0 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20  = pCur->idx+1;. 
1bc00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bc10 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e      upr = pCur->
1bc20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
1bc30 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
1bc40 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1bc50 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1bc60 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77   pCur->idx = (lw
1bc70 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a  r+upr)/2;.    }.
1bc80 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
1bc90 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73  =upr+1 );.    as
1bca0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1bcb0 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
1bcc0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bcd0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
1bce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
1bcf0 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
1bd00 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1bd10 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1bd20 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1bd30 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1bd40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bd50 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
1bd60 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1bd70 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
1bd80 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
1bd90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1bda0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
1bdb0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
1bdc0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
1bdd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ;.      if( pRes
1bde0 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20   ) *pRes = c;.  
1bdf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1be00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1be10 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b  pCur->idx = lwr;
1be20 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
1be30 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72  nSize = 0;.    r
1be40 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1be50 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
1be60 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1be70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1be80 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54    }.  }.  /* NOT
1be90 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 0a   REACHED */.}...
1bea0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1beb0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
1bec0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
1bed0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
1bee0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1bef0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
1bf00 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
1bf10 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
1bf20 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
1bf30 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
1bf40 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1bf50 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
1bf60 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
1bf70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
1bf80 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
1bf90 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
1bfa0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1bfb0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1bfc0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
1bfd0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1bfe0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
1bff0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
1c000 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
1c010 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
1c020 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
1c030 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
1c040 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
1c050 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
1c060 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
1c070 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
1c080 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
1c090 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
1c0a0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1c0b0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
1c0c0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
1c0d0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
1c0e0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1c0f0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
1c100 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1c110 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1c120 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1c130 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1c140 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1c150 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
1c160 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1c170 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1c180 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c190 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1c1a0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1c1b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
1c1c0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1c1d0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1c1e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1c1f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1c200 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
1c210 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
1c220 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1c230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c240 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1c250 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c260 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  Res!=0 );.  pPag
1c270 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1c280 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1c290 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1c2a0 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1c2b0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1c2c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c2d0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1c2e0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
1c2f0 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1c300 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1c310 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c320 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1c330 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1c340 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1c350 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1c360 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1c370 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64  l );..  pCur->id
1c380 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  x++;.  pCur->inf
1c390 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
1c3a0 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50  f( pCur->idx>=pP
1c3b0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1c3c0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1c3d0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1c3e0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1c3f0 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
1c400 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1c410 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
1c420 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1c430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c440 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1c450 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1c460 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1c470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c480 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
1c490 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
1c4a0 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61  eeIsRootPage(pPa
1c4b0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ge) ){.        *
1c4c0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1c4d0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1c4e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1c4f0 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 4c  .        cursorL
1c500 65 61 76 65 28 70 43 75 72 29 3b 0a 20 20 20 20  eave(pCur);.    
1c510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c520 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1c530 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c540 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
1c550 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
1c560 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1c570 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
1c580 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
1c590 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ll );.    *pRes 
1c5a0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
1c5b0 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a  ge->leafData ){.
1c5c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c5d0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
1c5e0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
1c5f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1c600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c610 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c620 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
1c630 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1c640 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
1c650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c660 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1c670 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
1c680 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
1c690 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1c6a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1c6b0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1c6c0 74 20 72 63 3b 0a 20 20 63 75 72 73 6f 72 45 6e  t rc;.  cursorEn
1c6d0 74 65 72 28 70 43 75 72 29 3b 0a 20 20 72 63 20  ter(pCur);.  rc 
1c6e0 3d 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  = btreeNext(pCur
1c6f0 2c 20 70 52 65 73 29 3b 0a 20 20 63 75 72 73 6f  , pRes);.  curso
1c700 72 4c 65 61 76 65 28 70 43 75 72 29 3b 0a 20 20  rLeave(pCur);.  
1c710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c720 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
1c730 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
1c740 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
1c750 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1c760 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1c770 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1c780 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1c790 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1c7a0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1c7b0 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
1c7c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1c7d0 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1c7e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1c7f0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1c800 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74  t *pRes=1..*/.st
1c810 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50 72  atic int btreePr
1c820 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
1c830 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1c840 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
1c850 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50  gno pgno;.  MemP
1c860 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 72  age *pPage;..  r
1c870 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
1c880 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
1c890 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1c8a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c8b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c8c0 7d 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  }.  if( CURSOR_I
1c8d0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1c8e0 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1c8f0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1c900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c910 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1c920 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p<0 ){.    pCur-
1c930 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1c940 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1c950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c960 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1c970 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
1c980 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1c990 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1c9a0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1c9b0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1c9c0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
1c9d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
1c9e0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20 66 69  o = get4byte( fi
1c9f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1ca00 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20  ur->idx) );.    
1ca10 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1ca20 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1ca30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1ca40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ca50 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
1ca60 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
1ca70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ca80 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
1ca90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
1caa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52   sqlite3BtreeIsR
1cab0 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1cac0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1cad0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1cae0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
1caf0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1cb00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cb10 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1cb20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1cb30 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
1cb40 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
1cb50 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1cb60 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
1cb70 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e  dx--;.    pCur->
1cb80 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1cb90 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1cba0 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67  eafData && !pPag
1cbb0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1cbc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1cbd0 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
1cbe0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
1cbf0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1cc00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1cc10 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
1cc20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
1cc30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
1cc40 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
1cc50 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1cc60 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1cc70 63 75 72 73 6f 72 45 6e 74 65 72 28 70 43 75 72  cursorEnter(pCur
1cc80 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 50  );.  rc = btreeP
1cc90 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
1cca0 65 73 29 3b 0a 20 20 63 75 72 73 6f 72 4c 65 61  es);.  cursorLea
1ccb0 76 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  ve(pCur);.  retu
1ccc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ccd0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
1cce0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
1ccf0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1cd00 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
1cd10 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
1cd20 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
1cd30 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
1cd40 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
1cd50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1cd60 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
1cd70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
1cd80 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
1cd90 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
1cda0 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
1cdb0 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
1cdc0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1cdd0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
1cde0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
1cdf0 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
1ce00 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
1ce10 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1ce20 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
1ce30 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
1ce40 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1ce50 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
1ce60 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
1ce70 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
1ce80 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
1ce90 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
1cea0 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
1ceb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1cec0 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
1ced0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
1cee0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1cef0 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
1cf00 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1cf10 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
1cf20 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
1cf30 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
1cf40 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
1cf50 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
1cf60 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
1cf70 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
1cf80 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
1cf90 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
1cfa0 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
1cfb0 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
1cfc0 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
1cfd0 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
1cfe0 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
1cff0 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
1d000 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
1d010 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
1d020 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
1d030 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
1d040 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
1d050 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1d060 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
1d070 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
1d080 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
1d090 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
1d0a0 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1d0b0 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
1d0c0 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
1d0d0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1d0e0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1d0f0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
1d100 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
1d110 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
1d120 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
1d130 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
1d140 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
1d150 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1d160 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1d170 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
1d180 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1d190 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
1d1a0 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
1d1b0 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
1d1c0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
1d1d0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1d1e0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
1d1f0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1d200 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
1d210 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d220 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1d230 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
1d240 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1d250 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  ge1;.  n = get4b
1d260 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1d270 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
1d280 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
1d290 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
1d2a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
1d2b0 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
1d2c0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
1d2d0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
1d2e0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
1d2f0 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
1d300 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
1d310 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
1d320 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
1d330 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
1d340 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
1d350 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
1d360 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
1d370 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
1d380 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
1d390 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
1d3a0 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
1d3b0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
1d3c0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
1d3d0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
1d3e0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
1d3f0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
1d400 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d410 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1d420 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
1d430 62 79 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72  by<=sqlite3Pager
1d440 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1d450 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1d460 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
1d470 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
1d480 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d490 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1d4a0 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
1d4b0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
1d4c0 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
1d4d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1d4e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1d4f0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1d500 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1d510 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1d520 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
1d530 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
1d540 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
1d550 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
1d560 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
1d570 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
1d580 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
1d590 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
1d5a0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
1d5b0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
1d5c0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
1d5d0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
1d5e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1d5f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d600 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1d610 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1d620 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
1d630 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1d640 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
1d650 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
1d660 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
1d670 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
1d680 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
1d690 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
1d6a0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
1d6b0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
1d6c0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
1d6d0 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
1d6e0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
1d6f0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
1d700 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1d710 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
1d720 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
1d730 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1d740 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
1d750 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
1d760 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1d770 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
1d780 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
1d790 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d7a0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1d7b0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1d7c0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
1d7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1d7e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1d7f0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
1d800 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
1d810 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1d820 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1d830 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
1d840 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1d850 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
1d860 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
1d870 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
1d880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
1d890 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
1d8a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1d8b0 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
1d8c0 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
1d8d0 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
1d8e0 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
1d8f0 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
1d900 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
1d910 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
1d920 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
1d930 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
1d940 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
1d950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1d960 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
1d970 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d980 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1d990 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1d9a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1d9b0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1d9c0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1d9d0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1d9e0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1d9f0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
1da00 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1da10 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1da20 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1da30 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1da40 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1da50 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1da60 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1da70 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
1da80 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
1da90 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
1daa0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
1dab0 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d  }else if( k>pBt-
1dac0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
1dad0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  8 ){.        /* 
1dae0 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
1daf0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
1db00 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1db10 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1db20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1db30 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
1db40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1db50 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
1db60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1db70 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
1db80 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
1db90 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
1dba0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
1dbb0 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
1dbc0 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
1dbd0 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
1dbe0 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
1dbf0 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
1dc00 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1dc10 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
1dc20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
1dc30 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1dc40 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
1dc50 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
1dc60 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1dc70 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1dc80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
1dc90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1dca0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1dcb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1dcc0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1dcd0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1dce0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1dcf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1dd00 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
1dd10 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
1dd20 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1dd30 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1dd40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1dd50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1dd60 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1dd70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1dd80 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
1dd90 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1dda0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1ddb0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1ddc0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1ddd0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1dde0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
1ddf0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1de00 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
1de10 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
1de20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
1de30 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
1de40 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
1de50 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
1de60 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
1de70 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1de80 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1de90 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
1dea0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
1deb0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
1dec0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
1ded0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1dee0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
1def0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1df00 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
1df10 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
1df20 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
1df30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1df40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1df50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1df60 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1df70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1df80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1df90 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
1dfa0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1dfb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1dfc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dfd0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1dfe0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1dff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1e000 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e010 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1e020 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1e030 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1e040 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1e050 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1e060 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1e070 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
1e080 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1e090 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1e0a0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1e0b0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
1e0c0 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
1e0d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
1e0e0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1e0f0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
1e100 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
1e110 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
1e120 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1e130 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
1e140 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1e150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e170 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
1e180 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1e190 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e1a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1e1b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e1c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e1d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e1e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1e1f0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1e200 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
1e210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1e220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e230 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1e240 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1e250 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
1e260 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
1e270 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
1e280 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
1e290 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e2a0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
1e2b0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
1e2c0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
1e2d0 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  int closest;.   
1e2e0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
1e2f0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1e300 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
1e310 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
1e320 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e330 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1e340 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1e350 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1e360 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1e370 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1e380 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1e390 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
1e3a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1e3b0 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
1e3c0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1e3d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
1e3e0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
1e3f0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
1e400 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
1e410 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
1e420 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
1e430 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
1e440 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1e450 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
1e460 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
1e470 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1e480 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
1e490 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
1e4a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1e4b0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
1e4c0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1e4d0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
1e4e0 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
1e4f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e510 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e520 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1e530 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1e540 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
1e550 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1e560 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
1e570 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
1e580 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
1e590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  ){.          *pP
1e5a0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
1e5b0 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e         if( *pPgn
1e5c0 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o>sqlite3PagerPa
1e5d0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1e5e0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
1e5f0 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65      /* Free page
1e600 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1e610 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
1e620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1e630 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e640 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
1e650 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
1e660 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
1e670 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
1e680 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1e6a0 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
1e6b0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
1e6c0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
1e6d0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
1e6e0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
1e6f0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
1e700 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
1e710 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1e720 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
1e730 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
1e740 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
1e750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e760 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
1e770 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
1e780 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e790 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
1e7a0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
1e7b0 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  age, 1);.       
1e7c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e7d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e7e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1e7f0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70  DontRollback((*p
1e800 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
1e810 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1e820 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e830 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
1e840 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e850 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e870 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1e880 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
1e890 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e8a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e8b0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1e8c0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1e8d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
1e8e0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
1e8f0 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
1e900 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
1e910 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
1e920 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1e930 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
1e940 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1e950 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74  eelist, so creat
1e960 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20  e a new page at 
1e970 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  the.    ** end o
1e980 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
1e990 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74    *pPgno = sqlit
1e9a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1e9b0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 2b 20  (pBt->pPager) + 
1e9c0 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1;..#ifndef SQLI
1e9d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1e9e0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
1e9f0 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
1ea00 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63 75 75  /* An incr-vacuu
1ea10 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  m has already ru
1ea20 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
1ea30 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68  ansaction. So th
1ea40 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  e.      ** page 
1ea50 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e  to allocate is n
1ea60 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68 79 73  ot from the phys
1ea70 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68 65 20  ical end of the 
1ea80 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20 20 20  file, but.      
1ea90 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e  ** at pBt->nTrun
1eaa0 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  c. .      */.   
1eab0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
1eac0 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20  >nTrunc+1;.     
1ead0 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
1eae0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1eaf0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28  Bt) ){.        (
1eb00 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
1eb10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1eb20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1eb30 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
1eb40 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29  E(pBt, *pPgno) )
1eb50 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
1eb60 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
1eb70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1eb80 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
1eb90 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
1eba0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
1ebb0 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
1ebc0 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
1ebd0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
1ebe0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
1ebf0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
1ec00 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
1ec10 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
1ec20 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
1ec30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41      */.      TRA
1ec40 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1ec50 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
1ec60 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
1ec70 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f  page)\n", *pPgno
1ec80 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1ec90 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1eca0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1ecb0 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e   );.      (*pPgn
1ecc0 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o)++;.    }.    
1ecd0 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1ece0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
1ecf0 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20  runc = *pPgno;. 
1ed00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1ed10 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1ed20 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ed30 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
1ed40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1ed50 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
1ed60 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
1ed70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ed80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1ed90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1eda0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
1edb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1edc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1edd0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1ede0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
1edf0 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
1ee00 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
1ee10 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
1ee20 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
1ee30 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
1ee40 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1ee50 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
1ee60 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
1ee70 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1ee80 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
1ee90 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
1eea0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1eeb0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70  }../*.** Add a p
1eec0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1eed0 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
1eee0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
1eef0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1ef00 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65  f() is NOT calle
1ef10 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  d for pPage..*/.
1ef20 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
1ef30 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
1ef40 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
1ef50 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1ef60 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
1ef70 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1ef80 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c  e1;.  int rc, n,
1ef90 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72   k;..  /* Prepar
1efa0 65 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66  e the page for f
1efb0 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65  reeing */.  asse
1efc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1efd0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1efe0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1eff0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
1f000 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d  no>1 );.  pPage-
1f010 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72  >isInit = 0;.  r
1f020 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1f030 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50  ->pParent);.  pP
1f040 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
1f050 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1f060 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
1f070 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
1f080 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1f090 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1f0a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1f0b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f0c0 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  rc;.  n = get4by
1f0d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1f0e0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
1f0f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1f100 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69  a[36], n+1);..#i
1f110 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
1f120 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
1f130 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
1f140 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
1f150 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
1f160 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
1f170 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
1f180 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
1f190 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
1f1a0 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
1f1b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1f1c0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
1f1d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
1f1e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f1f0 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d  .  memset(pPage-
1f200 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
1f210 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
1f220 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
1f230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f240 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66  TOVACUUM.  /* If
1f250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
1f260 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
1f270 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
1f280 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
1f290 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
1f2a0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1f2b0 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
1f2c0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1f2d0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1f2e0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
1f2f0 42 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  Bt, pPage->pgno,
1f300 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
1f310 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1f320 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f330 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
1f340 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==0 ){.    /* T
1f350 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1f360 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20   free page */.  
1f370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f380 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
1f390 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1f3a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1f3b0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  ;.    memset(pPa
1f3c0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38 29  ge->aData, 0, 8)
1f3d0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
1f3e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f3f0 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1f400 0a 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45  .    TRACE(("FRE
1f410 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72 73 74  E-PAGE: %d first
1f420 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
1f430 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1f440 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65 20 70   /* Other free p
1f450 61 67 65 73 20 61 6c 72 65 61 64 79 20 65 78 69  ages already exi
1f460 73 74 2e 20 20 52 65 74 72 69 76 65 20 74 68 65  st.  Retrive the
1f470 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
1f480 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
1f490 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66 69 6e  freelist and fin
1f4a0 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c  d out how many l
1f4b0 65 61 76 65 73 20 69 74 20 68 61 73 2e 20 2a 2f  eaves it has. */
1f4c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  .    MemPage *pT
1f4d0 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  runk;.    rc = s
1f4e0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1f4f0 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
1f500 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1f510 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30  32]), &pTrunk, 0
1f520 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1f530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b  return rc;.    k
1f540 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1f550 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
1f560 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e      if( k>=pBt->
1f570 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
1f580 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1f590 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20   trunk is full. 
1f5a0 20 54 75 72 6e 20 74 68 65 20 70 61 67 65 20 62   Turn the page b
1f5b0 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20  eing freed into 
1f5c0 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74  a new.      ** t
1f5d0 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e  runk page with n
1f5e0 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20  o leaves. */.   
1f5f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f600 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
1f610 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f620 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f630 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62   rc;.      put4b
1f640 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1f650 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
1f660 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1f670 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
1f680 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1f690 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1f6a0 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1f6b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52 41  pgno);.      TRA
1f6c0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1f6d0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
1f6e0 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
1f6f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f700 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54   pPage->pgno, pT
1f710 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
1f720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1f730 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
1f740 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
1f750 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
1f760 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
1f770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f780 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1f790 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f7a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f7b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1f7c0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
1f7d0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
1f7e0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1f7f0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1f800 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
1f810 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
1f820 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1f830 45 54 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ETE.        sqli
1f840 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1f850 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1f860 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1f870 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
1f880 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
1f890 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
1f8a0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
1f8b0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
1f8c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
1f8d0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
1f8e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f8f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
1f900 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
1f910 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
1f920 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
1f930 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1f940 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
1f950 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
1f960 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
1f970 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1f980 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1f990 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
1f9a0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
1f9b0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
1f9c0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  nt nOvfl;.  int 
1f9d0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
1f9e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f9f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1fa00 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1fa10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1fa20 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
1fa30 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1fa40 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
1fa50 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
1fa60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fa70 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
1fa80 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
1fa90 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
1faa0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
1fab0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
1fac0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
1fad0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
1fae0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
1faf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1fb00 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
1fb10 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
1fb20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
1fb30 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
1fb40 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
1fb50 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
1fb60 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
1fb70 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
1fb80 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  -- ){.    MemPag
1fb90 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  e *pOvfl;.    if
1fba0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
1fbb0 20 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65   ovflPgno>sqlite
1fbc0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1fbd0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1fbe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fbf0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fc00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1fc10 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
1fc20 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
1fc30 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d   &pOvfl, (nOvfl=
1fc40 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29  =0)?0:&ovflPgno)
1fc50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1fc60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
1fc70 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66   = freePage(pOvf
1fc80 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  l);.    sqlite3P
1fc90 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
1fca0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1fcb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1fcc0 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
1fcd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1fce0 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
1fcf0 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
1fd00 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
1fd10 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
1fd20 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
1fd30 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
1fd40 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
1fd50 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
1fd60 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
1fd70 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
1fd80 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
1fd90 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
1fda0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
1fdb0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
1fdc0 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
1fdd0 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
1fde0 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
1fdf0 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
1fe00 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
1fe10 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
1fe20 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
1fe30 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
1fe40 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
1fe50 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
1fe60 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
1fe70 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
1fe80 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
1fe90 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
1fea0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
1feb0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
1fec0 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
1fed0 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
1fee0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
1fef0 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
1ff00 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
1ff10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ff20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1ff30 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
1ff40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ff50 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
1ff60 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
1ff70 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
1ff80 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1ff90 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
1ffa0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
1ffb0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
1ffc0 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
1ffd0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1ffe0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
20010 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
20020 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
20030 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
20040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
20050 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
20060 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
20070 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
20080 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
20090 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
200a0 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
200b0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
200c0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
200d0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
200e0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
200f0 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
20100 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
20110 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
20120 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
20130 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
20140 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
20150 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
20160 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
20170 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20180 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
20190 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
201a0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
201b0 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
201c0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
201d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
201e0 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
201f0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
20200 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
20210 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
20220 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
20230 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
20240 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20250 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
20260 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
20270 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
20280 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
20290 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
202a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
202b0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
202c0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
202d0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
202e0 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
202f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
20300 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
20310 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
20320 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f  ata==nData+nZero
20330 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
20340 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
20350 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
20360 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
20370 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
20380 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
20390 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
203a0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
203b0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
203c0 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  {.    nPayload +
203d0 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  = nKey;.    pSrc
203e0 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
203f0 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  c = nKey;.  }.  
20400 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
20410 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
20420 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
20430 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
20440 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
20450 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
20460 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
20470 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
20480 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
20490 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
204a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78  {.      int isEx
204b0 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  act = 0;.#ifndef
204c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
204d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
204e0 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
204f0 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
20500 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
20510 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
20520 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
20530 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
20540 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
20550 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
20560 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
20570 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
20580 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
20590 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
205a0 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
205b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
205c0 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
205d0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66       if( pgnoOvf
205e0 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l>1 ){.         
205f0 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b   /* isExact = 1;
20600 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
20610 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20620 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
20630 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
20640 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
20650 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78  , pgnoOvfl, isEx
20660 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  act);.#ifndef SQ
20670 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20680 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
20690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
206a0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
206b0 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
206c0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
206d0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
206e0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
206f0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
20700 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
20710 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
20720 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
20730 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
20740 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
20750 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
20760 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
20770 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
20780 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
20790 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
207a0 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
207b0 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
207c0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
207d0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
207e0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
207f0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
20800 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
20810 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
20820 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
20830 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
20840 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
20850 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
20860 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
20870 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
20880 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
20890 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
208a0 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
208b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
208c0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
208d0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
208e0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
208f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
20900 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
20910 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
20920 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
20930 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
20940 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20950 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20960 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
20970 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
20980 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
20990 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
209a0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
209b0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
209c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
209d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
209e0 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
209f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20a00 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
20a10 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
20a20 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
20a30 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
20a40 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
20a50 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
20a60 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
20a70 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
20a80 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
20a90 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
20aa0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
20ab0 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
20ac0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
20ad0 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
20ae0 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28  aceLeft;.    if(
20af0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
20b00 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
20b10 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
20b20 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
20b30 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
20b40 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
20b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20b60 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
20b70 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
20b80 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
20b90 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
20ba0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
20bb0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
20bc0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
20bd0 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
20be0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
20bf0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
20c00 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
20c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
20c20 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
20c30 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
20c40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20c50 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65  ** Change the Me
20c60 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f  mPage.pParent po
20c70 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67  inter on the pag
20c80 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69  e whose number i
20c90 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  s.** given in th
20ca0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
20cb0 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67  t so that MemPag
20cc0 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  e.pParent holds 
20cd0 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  the.** pointer i
20ce0 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  n the third argu
20cf0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
20d00 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65  int reparentPage
20d10 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
20d20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61  Pgno pgno, MemPa
20d30 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20  ge *pNewParent, 
20d40 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50  int idx){.  MemP
20d50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62  age *pThis;.  Db
20d60 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
20d70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20d80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
20d90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
20da0 73 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74  sert( pNewParent
20db0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  !=0 );.  if( pgn
20dc0 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
20dd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
20de0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  t( pBt->pPager!=
20df0 30 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  0 );.  pDbPage =
20e00 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
20e10 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
20e20 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
20e30 62 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68  bPage ){.    pTh
20e40 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  is = (MemPage *)
20e50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
20e60 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
20e70 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73     if( pThis->is
20e80 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Init ){.      as
20e90 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61  sert( pThis->aDa
20ea0 74 61 3d 3d 28 73 71 6c 69 74 65 33 50 61 67 65  ta==(sqlite3Page
20eb0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
20ec0 29 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  )) );.      if( 
20ed0 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d  pThis->pParent!=
20ee0 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20  pNewParent ){.  
20ef0 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
20f00 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74  >pParent ) sqlit
20f10 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68  e3PagerUnref(pTh
20f20 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62  is->pParent->pDb
20f30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
20f40 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20  This->pParent = 
20f50 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  pNewParent;.    
20f60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20f70 52 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e  Ref(pNewParent->
20f80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20f90 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69  }.      pThis->i
20fa0 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a  dxParent = idx;.
20fb0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20fc0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
20fd0 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  age);.  }..#ifnd
20fe0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
20ff0 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
21000 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
21010 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74  ){.    return pt
21020 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
21030 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
21040 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e   pNewParent->pgn
21050 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  o);.  }.#endif. 
21060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21070 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  K;.}..../*.** Ch
21080 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74  ange the pParent
21090 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20   pointer of all 
210a0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67  children of pPag
210b0 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a  e to point back.
210c0 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a  ** to pPage..**.
210d0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
210e0 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69  s, for every chi
210f0 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76  ld of pPage, inv
21100 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65  oke reparentPage
21110 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75  ().** to make su
21120 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69  re that each chi
21130 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50  ld knows that pP
21140 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e  age is its paren
21150 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
21160 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
21170 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63  d after you memc
21180 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e  py() one page in
21190 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a  to.** another..*
211a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
211b0 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
211c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
211d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68  .  int i;.  BtSh
211e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
211f0 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  e->pBt;.  int rc
21200 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21210 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21220 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
21230 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
21240 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
21250 65 61 66 20 29 20 72 65 74 75 72 6e 20 53 51 4c  eaf ) return SQL
21260 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69  ITE_OK;..  for(i
21270 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
21280 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
21290 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
212a0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
212b0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
212c0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
212d0 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
212e0 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
212f0 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20  l), pPage, i);. 
21300 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21310 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
21320 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
21330 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
21340 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70   ){.    rc = rep
21350 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
21360 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
21370 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
21380 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20  Offset+8]), .   
21390 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20      pPage, i);. 
213a0 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69     pPage->idxShi
213b0 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ft = 0;.  }.  re
213c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
213d0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
213e0 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
213f0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
21400 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
21410 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
21420 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
21430 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
21440 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
21450 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
21460 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
21470 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
21480 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
21490 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
214a0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
214b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
214c0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
214d0 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
214e0 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
214f0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
21500 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
21510 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
21520 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
21530 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  t idx, int sz){.
21540 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
21550 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21560 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
21570 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
21580 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
21590 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
215a0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
215b0 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
215c0 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
215d0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
215e0 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
215f0 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
21600 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  thin data[] */..
21610 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
21620 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
21630 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
21640 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
21650 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
21660 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
21670 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
21680 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
21690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
216a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
216b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
216c0 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
216d0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
216e0 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
216f0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
21700 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
21710 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61  t2byte(ptr);.  a
21720 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20  ssert( pc>10 && 
21730 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42  pc+sz<=pPage->pB
21740 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
21750 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61  .  freeSpace(pPa
21760 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66  ge, pc, sz);.  f
21770 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
21780 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
21790 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
217a0 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
217b0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
217c0 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
217d0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
217e0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
217f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
21800 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
21810 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
21820 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   2;.  pPage->idx
21830 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Shift = 1;.}../*
21840 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
21850 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
21860 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
21870 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
21880 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
21890 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
218a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
218b0 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
218c0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
218d0 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
218e0 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
218f0 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
21900 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
21910 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
21920 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
21930 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
21940 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
21950 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
21960 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
21970 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   in pPage->aOvfl
21980 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
21990 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
219a0 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
219b0 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
219c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
219d0 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
219e0 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
219f0 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
21a00 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
21a10 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
21a20 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
21a30 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
21a40 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
21a50 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20  .** If nSkip is 
21a60 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64  non-zero, then d
21a70 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66  o not copy the f
21a80 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73  irst nSkip bytes
21a90 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e   of the.** cell.
21aa0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
21ab0 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20   overwrite them 
21ac0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
21ad0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a  ion returns. If.
21ae0 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  ** nSkip is non-
21af0 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c  zero, then pCell
21b00 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74   may not point t
21b10 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d  o an invalid mem
21b20 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a  ory location .**
21b30 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69   (but pCell+nSki
21b40 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  p is always vali
21b50 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
21b60 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  t insertCell(.  
21b70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
21b80 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
21b90 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
21ba0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
21bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
21bc0 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
21bd0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
21be0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
21bf0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
21c00 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
21c10 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
21c20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
21c30 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
21c40 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
21c50 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
21c60 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
21c70 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
21c80 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
21c90 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20   */.  u8 nSkip  
21ca0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
21cb0 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73  t write the firs
21cc0 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
21cd0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a   the cell */.){.
21ce0 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
21cf0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
21d00 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
21d10 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
21d20 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
21d30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21d40 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
21d50 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f   top;          /
21d60 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
21d70 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
21d80 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a  cell in data[] *
21d90 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
21da0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
21db0 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
21dc0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
21dd0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
21de0 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
21df0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
21e00 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
21e10 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
21e20 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68  erted */.  int h
21e30 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dr;          /* 
21e40 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61  Offset into data
21e50 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  [] of the page h
21e60 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
21e70 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
21e80 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
21e90 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
21ea0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
21eb0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
21ec0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
21ed0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
21ee0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
21ef0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
21f00 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
21f10 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
21f20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  data[] */..  ass
21f30 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
21f40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
21f50 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
21f60 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
21f70 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
21f80 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  , pCell) );.  as
21f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21fa0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
21fb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
21fc0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
21fd0 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
21fe0 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
21ff0 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
22000 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
22010 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
22020 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
22030 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
22040 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
22050 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
22060 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
22070 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61  rt( j<sizeof(pPa
22080 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
22090 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
220a0 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ]) );.    pPage-
220b0 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20  >aOvfl[j].pCell 
220c0 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61  = pCell;.    pPa
220d0 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78  ge->aOvfl[j].idx
220e0 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d   = i;.    pPage-
220f0 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  >nFree = 0;.  }e
22100 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
22110 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
22120 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
22130 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
22140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22160 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22170 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
22180 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
22190 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
221a0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
221b0 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70  ata;.    hdr = p
221c0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
221d0 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
221e0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
221f0 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  );.    cellOffse
22200 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
22210 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
22220 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
22230 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32  pPage->nCell + 2
22240 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
22250 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
22260 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20    if( end > top 
22270 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63  - sz ){.      rc
22280 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
22290 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
222a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
222b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
222c0 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62       top = get2b
222d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
222e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
222f0 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70   end + sz <= top
22300 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
22310 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  x = allocateSpac
22320 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20  e(pPage, sz);.  
22330 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20    assert( idx>0 
22340 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
22350 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26  nd <= get2byte(&
22360 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
22370 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
22380 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
22390 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d  Free -= 2;.    m
223a0 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
223b0 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
223c0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
223d0 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c      for(j=end-2,
223e0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
223f0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
22400 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
22410 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
22420 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
22430 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
22440 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
22450 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
22460 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
22470 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
22480 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  l);.    pPage->i
22490 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66  dxShift = 1;.#if
224a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
224b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
224c0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
224d0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
224e0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
224f0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
22500 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
22510 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
22520 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
22530 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
22540 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
22550 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
22560 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
22570 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
22580 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
22590 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
225a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
225b0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
225c0 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
225d0 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
225e0 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
225f0 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
22600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  );.      if( (in
22610 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
22620 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
22630 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
22640 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  l ){.        Pgn
22650 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
22660 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
22670 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
22680 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
22690 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
226a0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
226b0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
226c0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
226d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
226e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
226f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
22700 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
22710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
22730 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
22740 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
22750 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
22760 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
22770 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
22780 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
22790 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
227a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
227b0 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
227c0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
227d0 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
227e0 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
227f0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
22800 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
22810 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
22820 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
22830 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
22840 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
22850 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
22860 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20  */.  int *aSize 
22870 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
22880 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
22890 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
228a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
228b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
228c0 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a  totalSize;    /*
228d0 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61   Total size of a
228e0 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e  ll cells */.  in
228f0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
22900 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65  /* Index of page
22910 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
22920 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f   cellptr;      /
22930 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
22940 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
22950 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79  /.  int cellbody
22960 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
22970 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f   of next cell bo
22980 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  dy */.  u8 *data
22990 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
229a0 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  a for the page *
229b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
229c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
229d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
229e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
229f0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
22a00 65 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69  ex) );.  totalSi
22a10 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ze = 0;.  for(i=
22a20 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
22a30 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20  {.    totalSize 
22a40 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d  += aSize[i];.  }
22a50 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c  .  assert( total
22a60 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50  Size+2*nCell<=pP
22a70 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20  age->nFree );.  
22a80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
22a90 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c  Cell==0 );.  cel
22aa0 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65  lptr = pPage->ce
22ab0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  llOffset;.  data
22ac0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
22ad0 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
22ae0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74  hdrOffset;.  put
22af0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
22b00 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66  3], nCell);.  if
22b10 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63  ( nCell ){.    c
22b20 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61  ellbody = alloca
22b30 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74  teSpace(pPage, t
22b40 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61  otalSize);.    a
22b50 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e  ssert( cellbody>
22b60 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
22b70 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d   pPage->nFree >=
22b80 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20   2*nCell );.    
22b90 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
22ba0 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72  2*nCell;.    for
22bb0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
22bc0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62  ++){.      put2b
22bd0 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74  yte(&data[cellpt
22be0 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  r], cellbody);. 
22bf0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
22c00 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43  a[cellbody], apC
22c10 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d  ell[i], aSize[i]
22c20 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72  );.      cellptr
22c30 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c   += 2;.      cel
22c40 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69  lbody += aSize[i
22c50 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  ];.    }.    ass
22c60 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70  ert( cellbody==p
22c70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
22c80 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70  eSize );.  }.  p
22c90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43  Page->nCell = nC
22ca0 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
22cb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
22cc0 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
22cd0 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
22ce0 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
22cf0 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
22d00 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
22d10 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
22d20 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
22d30 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
22d40 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
22d50 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
22d60 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
22d70 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
22d80 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
22d90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
22da0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
22db0 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
22dc0 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
22dd0 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
22de0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
22df0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
22e00 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
22e10 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
22e20 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
22e30 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
22e40 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
22e50 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
22e60 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
22e70 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
22e80 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
22e90 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
22ea0 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
22eb0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
22ec0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
22ed0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
22ee0 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
22ef0 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
22f00 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
22f10 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
22f20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22f30 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
22f40 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
22f50 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
22f60 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
22f70 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
22f80 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
22f90 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46  balance */../* F
22fa0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
22fb0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62   */.static int b
22fc0 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c  alance(MemPage*,
22fd0 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20   int);..#ifndef 
22fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
22ff0 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
23000 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
23010 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
23020 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
23030 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
23040 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
23050 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
23060 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
23070 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
23080 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
23090 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
230a0 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
230b0 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
230c0 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
230d0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
230e0 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
230f0 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
23100 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
23110 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
23120 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
23130 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
23140 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
23150 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
23160 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
23170 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
23180 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
23190 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
231a0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
231b0 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
231c0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
231d0 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
231e0 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
231f0 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
23200 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
23210 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
23220 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
23230 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
23240 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
23250 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
23260 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
23270 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
23280 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
23290 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
232a0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
232b0 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
232c0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
232d0 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
232e0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
232f0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
23300 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
23310 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
23320 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67  e *pPage, MemPag
23330 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69  e *pParent){.  i
23340 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
23350 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70   *pNew;.  Pgno p
23360 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43  gnoNew;.  u8 *pC
23370 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c  ell;.  int szCel
23380 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  l;.  CellInfo in
23390 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  fo;.  BtShared *
233a0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
233b0 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64  ;.  int parentId
233c0 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  x = pParent->nCe
233d0 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74  ll;   /* pParent
233e0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
233f0 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
23400 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20   parentSize;    
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23420 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69  * Size of new di
23430 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
23440 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34  u8 parentCell[64
23450 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
23460 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74    /* Space for t
23470 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
23480 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ell */..  assert
23490 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
234a0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
234b0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
234c0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
234d0 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65  page. Insert the
234e0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
234f0 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69  rom pPage.  ** i
23500 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d  nto it. Then rem
23510 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ove the overflow
23520 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
23530 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
23540 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
23550 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
23560 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69  oNew, 0, 0);.  i
23570 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23580 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
23590 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d  c;.  }.  pCell =
235a0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
235b0 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c  .pCell;.  szCell
235c0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
235d0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
235e0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
235f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  Page->aData[0]);
23600 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  .  assemblePage(
23610 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
23620 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61   &szCell);.  pPa
23630 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
23640 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
23650 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e   parent of the n
23660 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
23670 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20  age to pParent. 
23680 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65  */.  pNew->pPare
23690 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  nt = pParent;.  
236a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
236b0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
236c0 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
236d0 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20  s currently the 
236e0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
236f0 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74  Parent. Change t
23700 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  his.  ** so that
23710 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
23720 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65   is the new page
23730 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
23740 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20   and.  ** pPage 
23750 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72  is the next-to-r
23760 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a  ight child. .  *
23770 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
23780 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
23790 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
237a0 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
237b0 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74  Cell-1);.  sqlit
237c0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
237d0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
237e0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d  , &info);.  rc =
237f0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
23800 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  ent, parentCell,
23810 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
23820 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53  , 0, 0, &parentS
23830 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
23840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
23860 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74    assert( parent
23870 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20  Size<64 );.  rc 
23880 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
23890 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c  rent, parentIdx,
238a0 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72   parentCell, par
238b0 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a  entSize, 0, 4);.
238c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
238d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
238e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34  n rc;.  }.  put4
238f0 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
23900 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61  wCell(pParent,pa
23910 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d  rentIdx), pPage-
23920 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79  >pgno);.  put4by
23930 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
23940 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
23950 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
23960 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  w);..#ifndef SQL
23970 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
23980 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  UUM.  /* If this
23990 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
239a0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
239b0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
239c0 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e  map.  ** with en
239d0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
239e0 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
239f0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
23a00 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74   .  ** cell on t
23a10 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
23a20 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
23a30 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
23a40 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
23a50 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
23a60 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
23a70 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
23a80 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  t->pgno);.    if
23a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23aa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
23ab0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
23ac0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
23ad0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23ae0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
23af0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
23b00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23b10 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
23b20 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
23b30 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
23b40 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20  he new page and 
23b50 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
23b60 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e  nt page,.  ** in
23b70 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65   case the divide
23b80 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  r cell inserted 
23b90 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63  caused it to bec
23ba0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20  ome overfull..  
23bb0 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  */.  releasePage
23bc0 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  (pNew);.  return
23bd0 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74   balance(pParent
23be0 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  , 0);.}.#endif /
23bf0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
23c00 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f  ICKBALANCE */../
23c10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23c20 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
23c30 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61  Cells on pPage a
23c40 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69  nd up to NN*2 si
23c50 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61  blings.** of pPa
23c60 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  ge so that all p
23c70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
23c80 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  the same amount 
23c90 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a  of free space..*
23ca0 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62  * Usually NN sib
23cb0 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20  lings on either 
23cc0 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73  side of pPage is
23cd0 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
23ce0 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67  ancing,.** thoug
23cf0 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  h more siblings 
23d00 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
23d10 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67  one side if pPag
23d20 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  e is the first.*
23d30 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  * or last child 
23d40 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  of its parent.  
23d50 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77  If pPage has few
23d60 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62  er than 2*NN sib
23d70 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68  lings.** (someth
23d80 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
23d90 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61  ly happen if pPa
23da0 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
23db0 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69  age or a .** chi
23dc0 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e  ld of root) then
23dd0 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
23de0 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70  iblings particip
23df0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
23e00 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
23e10 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
23e20 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68  gs of pPage migh
23e30 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
23e40 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
23e50 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20  ne or.** two in 
23e60 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
23e70 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
23e80 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
23e90 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20   full. The root 
23ea0 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69  page.** is speci
23eb0 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65  al and is allowe
23ec0 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65  d to be nearly e
23ed0 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69  mpty. If pPage i
23ee0 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s .** the root p
23ef0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  age, then the de
23f00 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
23f10 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
23f20 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73  ed.** or decreas
23f30 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65  ed by one, as ne
23f40 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70  cessary, to keep
23f50 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66   the root page f
23f60 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65  rom being.** ove
23f70 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74  rfull or complet
23f80 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  ely empty..**.**
23f90 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
23fa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
23fb0 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
23fc0 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  the Cells on pPa
23fd0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
23fe0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
23ff0 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ed in pPage->aDa
24000 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20  ta[].  This can 
24010 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
24020 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
24030 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20  l.  Part of the 
24040 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
24050 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b  ine is to.** mak
24060 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73  e sure all Cells
24070 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20   for pPage once 
24080 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61  again fit in pPa
24090 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a  ge->aData[]..**.
240a0 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
240b0 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
240c0 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  e siblings of pP
240d0 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  age, the parent 
240e0 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  of pPage.** migh
240f0 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  t become overful
24100 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
24110 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   If that happens
24120 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
24130 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
24140 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
24150 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  the parent..**.*
24160 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
24170 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
24180 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
24190 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
241a0 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
241b0 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f  upted state.  So
241c0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
241d0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
241e0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
241f0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
24200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
24210 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d  ance_nonroot(Mem
24220 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
24230 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
24240 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24250 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  The parent of pP
24260 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
24270 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
24280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
24290 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
242a0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
242c0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
242d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
242e0 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
242f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
24300 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
24310 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
24320 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
24330 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24350 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
24360 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
24370 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24390 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
243a0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
243b0 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20  int nDiv;       
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
243d0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
243e0 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20  in apDiv[] */.  
243f0 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24410 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
24420 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67  /* Index of pPag
24450 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  e in pParent->aC
24460 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
24470 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
24480 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
24490 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
244a0 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
244b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244d0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
244e0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   code */.  int l
244f0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
24500 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
24510 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
24520 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
24530 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24550 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
24560 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
24570 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
24580 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
245a0 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
245b0 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
245c0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
245d0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
245e0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
245f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
24600 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
24610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24620 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
24630 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
24640 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
24650 69 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b 20  int iSpace = 0; 
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24670 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
24680 65 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f  e of aSpace[] */
24690 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
246a0 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
246b0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
246c0 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
246d0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c  */.  Pgno pgnoOl
246e0 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
246f0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
24700 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
24710 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
24720 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
24730 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
24740 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
24750 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
24760 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
24770 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
24780 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
24790 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
247a0 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
247b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   */.  Pgno pgnoN
247c0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
247d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
247e0 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
247f0 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
24800 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20   u8 *apDiv[NB]; 
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24820 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   Divider cells i
24830 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  n pParent */.  i
24840 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b  nt cntNew[NB+2];
24850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24860 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20  ndex in aCell[] 
24870 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d  of cell after i-
24880 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  th page */.  int
24890 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20   szNew[NB+2];   
248a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
248b0 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65  bined size of ce
248c0 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74  lls place on i-t
248d0 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  h page */.  u8 *
248e0 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  *apCell = 0;    
248f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
24900 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61  cells begin bala
24910 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73  nced */.  int *s
24920 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
24930 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
24940 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
24950 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
24960 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d  .  u8 *aCopy[NB]
24970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24980 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c  /* Space for hol
24990 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43  ding data of apC
249a0 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  opy[] */.  u8 *a
249b0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
249c0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
249d0 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73 20   to hold copies 
249e0 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
249f0 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
24a00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24a10 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20  UUM.  u8 *aFrom 
24a20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  = 0;.#endif..  a
24a30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24a40 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
24a50 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
24a60 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64  .  /* .  ** Find
24a70 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
24a80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
24a90 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
24aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24ab0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
24ac0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
24ad0 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  ge) || pPage->nO
24ae0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
24af0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
24b00 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
24b10 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
24b20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
24b30 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
24b40 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
24b50 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
24b60 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29  ent->pDbPage)) )
24b70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
24b80 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
24b90 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
24ba0 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
24bb0 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
24bc0 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
24bd0 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
24be0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
24bf0 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  LANCE.  /*.  ** 
24c00 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20  A special case: 
24c10 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20   If a new entry 
24c20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e  has just been in
24c30 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20  serted into a.  
24c40 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69  ** table (that i
24c50 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20  s, a btree with 
24c60 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64  integer keys and
24c70 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65   all data at the
24c80 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e   leaves).  ** an
24c90 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
24ca0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
24cb0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
24cc0 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a  ree (it has the.
24cd0 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
24ce0 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73  ) then use the s
24cf0 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71  pecial balance_q
24d00 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  uick() routine f
24d10 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  or.  ** balancin
24d20 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  g.  balance_quic
24d30 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74  k() is much fast
24d40 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69  er and results i
24d50 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a  n a tighter.  **
24d60 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61   packing of data
24d70 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
24d80 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
24d90 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20  pPage->leaf &&. 
24da0 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
24db0 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ey &&.      pPag
24dc0 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20  e->leafData &&. 
24dd0 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
24de0 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20  rflow==1 &&.    
24df0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30    pPage->aOvfl[0
24e00 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
24e10 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61  ell &&.      pPa
24e20 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
24e30 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65  o!=1 &&.      ge
24e40 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
24e50 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
24e60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
24e70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a  Page->pgno.  ){.
24e80 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f      /*.    ** TO
24e90 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69  DO: Check the si
24ea0 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65  blings to the le
24eb0 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20  ft of pPage. It 
24ec0 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20  may be that.    
24ed0 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ** they are not 
24ee0 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20  full and no new 
24ef0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
24f00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
24f10 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  urn balance_quic
24f20 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  k(pPage, pParent
24f30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
24f40 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
24f50 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
24f60 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
24f70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
24f80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
24f90 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
24fa0 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70  he cell in the p
24fb0 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65  arent page whose
24fc0 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e   left child poin
24fd0 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20  ts back.  ** to 
24fe0 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78  pPage.  The "idx
24ff0 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68  " variable is th
25000 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
25010 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a  cell.  If pPage.
25020 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68    ** is the righ
25030 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  tmost child of p
25040 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20  Parent then set 
25050 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e  idx to pParent->
25060 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66  nCell .  */.  if
25070 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68  ( pParent->idxSh
25080 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ift ){.    Pgno 
25090 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  pgno;.    pgno =
250a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20   pPage->pgno;.  
250b0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d    assert( pgno==
250c0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
250d0 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
250e0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f  bPage) );.    fo
250f0 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61  r(idx=0; idx<pPa
25100 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78  rent->nCell; idx
25110 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67  ++){.      if( g
25120 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
25130 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d  (pParent, idx))=
25140 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  =pgno ){.       
25150 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25160 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
25170 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ( idx<pParent->n
25180 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Cell.           
25190 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70    || get4byte(&p
251a0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
251b0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
251c0 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  +8])==pgno );.  
251d0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d  }else{.    idx =
251e0 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
251f0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  t;.  }..  /*.  *
25200 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72  * Initialize var
25210 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69  iables so that i
25220 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74  t will be safe t
25230 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65  o jump.  ** dire
25240 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f  ctly to balance_
25250 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d  cleanup at any m
25260 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  oment..  */.  nO
25270 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20  ld = nNew = 0;. 
25280 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
25290 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
252a0 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  e);..  /*.  ** F
252b0 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ind sibling page
252c0 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74  s to pPage and t
252d0 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
252e0 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a  ent that divide.
252f0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
25300 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69  s.  An attempt i
25310 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
25320 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
25330 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f  ther.  ** side o
25340 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73  f pPage.  More s
25350 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
25360 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
25370 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a   however, if.  *
25380 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72  * pPage there ar
25390 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
253a0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
253b0 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20  other side.  If 
253c0 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
253d0 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
253e0 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
253f0 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
25400 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20  nt are taken..  
25410 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78  */.  nxDiv = idx
25420 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44   - NN;.  if( nxD
25430 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e  iv + NB > pParen
25440 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
25450 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d  nxDiv = pParent-
25460 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b  >nCell - NB + 1;
25470 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
25480 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <0 ){.    nxDiv 
25490 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20  = 0;.  }.  nDiv 
254a0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 0;.  for(i=0, 
254b0 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69  k=nxDiv; i<NB; i
254c0 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, k++){.    if
254d0 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  ( k<pParent->nCe
254e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ll ){.      apDi
254f0 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
25500 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20  pParent, k);.   
25510 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20     nDiv++;.     
25520 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e   assert( !pParen
25530 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20  t->leaf );.     
25540 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
25550 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
25560 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25570 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  k==pParent->nCel
25580 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  l ){.      pgnoO
25590 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65  ld[i] = get4byte
255a0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
255b0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
255c0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
255d0 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
255e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
255f0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
25600 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20  Bt, pgnoOld[i], 
25610 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65  &apOld[i], pPare
25620 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
25630 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
25640 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c  leanup;.    apOl
25650 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20  d[i]->idxParent 
25660 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b  = k;.    apCopy[
25670 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  i] = 0;.    asse
25680 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20  rt( i==nOld );. 
25690 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e     nOld++;.    n
256a0 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
256b0 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
256c0 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
256d0 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  w;.  }..  /* Mak
256e0 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
256f0 6c 74 69 70 6c 65 20 6f 66 20 32 20 69 6e 20 6f  ltiple of 2 in o
25700 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
25710 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
25720 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
25730 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
25740 6c 73 20 2b 20 31 29 26 7e 31 3b 0a 0a 20 20 2f  ls + 1)&~1;..  /
25750 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
25760 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
25770 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
25780 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
25790 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  te3_malloc( .   
257a0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
257b0 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
257e0 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
257f0 73 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20  s*sizeof(int)   
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
25820 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55 4e  l */.     + ROUN
25830 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
25840 65 29 29 2a 4e 42 20 20 20 20 20 20 20 20 20 20  e))*NB          
25850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
25860 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Copy */.     + p
25870 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35 2b  Bt->pageSize*(5+
25880 4e 42 29 20 20 20 20 20 20 20 20 20 20 20 20 20  NB)             
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
258a0 2a 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20 20  * aSpace */.    
258b0 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d   + (ISAUTOVACUUM
258c0 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30   ? nMaxCells : 0
258d0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
258e0 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20     /* aFrom */. 
258f0 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
25900 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
25910 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25920 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
25930 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
25940 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70  Cell = (int*)&ap
25950 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
25960 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75  .  aCopy[0] = (u
25970 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
25980 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
25990 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75   ((aCopy[0] - (u
259a0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
259b0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
259c0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
259d0 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
259e0 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
259f0 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
25a00 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
25a10 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
25a20 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
25a30 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
25a40 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70  opy[i] - (u8*)ap
25a50 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
25a60 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
25a70 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
25a80 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20  .  }.  aSpace = 
25a90 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74  &aCopy[NB-1][pBt
25aa0 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
25ab0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
25ac0 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ))];.  assert( (
25ad0 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61  (aSpace - (u8*)a
25ae0 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
25af0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
25b00 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
25b10 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
25b20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25b30 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
25b40 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46  Vacuum ){.    aF
25b50 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a  rom = &aSpace[5*
25b60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
25b70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
25b80 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70  /*.  ** Make cop
25b90 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ies of the conte
25ba0 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20  nt of pPage and 
25bb0 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74  its siblings int
25bc0 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54  o aOld[]..  ** T
25bd0 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
25be0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  function will us
25bf0 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
25c00 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20  copies rather.  
25c10 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
25c20 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
25c30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
25c40 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
25c50 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  he.  ** process 
25c60 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
25c70 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tten..  */.  for
25c80 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
25c90 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
25ca0 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  *p = apCopy[i] =
25cb0 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 43 6f 70   (MemPage*)&aCop
25cc0 79 5b 69 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  y[i][pBt->pageSi
25cd0 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  ze];.    p->aDat
25ce0 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70  a = &((u8*)p)[-p
25cf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
25d00 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61     memcpy(p->aDa
25d10 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
25d20 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
25d30 7a 65 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 50  ze + sizeof(MemP
25d40 61 67 65 29 29 3b 0a 20 20 20 20 2f 2a 20 54 68  age));.    /* Th
25d50 65 20 6d 65 6d 63 70 79 28 29 20 61 62 6f 76 65  e memcpy() above
25d60 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
25d70 75 65 20 6f 66 20 70 2d 3e 61 44 61 74 61 20 73  ue of p->aData s
25d80 6f 20 77 65 20 68 61 76 65 20 74 6f 0a 20 20 20  o we have to.   
25d90 20 2a 2a 20 73 65 74 20 69 74 20 61 67 61 69 6e   ** set it again
25da0 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 44 61 74  . */.    p->aDat
25db0 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70  a = &((u8*)p)[-p
25dc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
25dd0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
25de0 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
25df0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
25e00 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
25e10 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
25e20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
25e30 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
25e40 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
25e50 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
25e60 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
25e70 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
25e80 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64  orm aSpace[] and
25e90 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
25ea0 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
25eb0 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
25ec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
25ed0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
25ee0 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
25ef0 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
25f00 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
25f10 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
25f20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
25f30 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
25f40 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
25f50 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
25f60 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ace[].  In this 
25f70 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
25f80 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
25f90 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
25fa0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
25fb0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
25fc0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
25fd0 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
25fe0 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
25ff0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
26000 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
26010 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
26020 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
26030 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
26040 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
26050 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
26060 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
26070 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
26080 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
26090 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
260a0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
260b0 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
260c0 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
260d0 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
260e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
260f0 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
26100 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
26110 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
26120 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66  pPage->leaf;.  f
26130 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
26140 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
26150 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
26160 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
26170 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
26180 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
26190 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
261a0 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
261b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
261c0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
261d0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
261e0 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
261f0 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
26200 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
26210 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
26220 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
26230 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20  Cell]);.#ifndef 
26240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26250 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
26260 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26270 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
26280 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
26290 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20  [nCell] = i;.   
262a0 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c       for(a=0; a<
262b0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
262c0 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   a++){.         
262d0 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c   if( pOld->aOvfl
262e0 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c  [a].pCell==apCel
262f0 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20  l[nCell] ){.    
26300 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
26310 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
26320 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
26330 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26340 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
26350 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c  ndif.      nCell
26360 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
26370 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
26380 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c      int sz = cel
26390 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
263a0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
263b0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
263c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
263d0 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
263e0 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
263f0 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
26400 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
26410 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
26420 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
26430 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
26440 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
26450 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
26460 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
26470 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
26480 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
26490 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
264a0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
264b0 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
264c0 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
264d0 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
264e0 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
264f0 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
26500 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
26510 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
26520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
26530 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
26540 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
26550 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
26560 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
26570 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
26580 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
26590 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
265a0 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
265b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
265c0 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
265d0 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
265e0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
265f0 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
26600 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
26610 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
26620 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e  Correction;.#ifn
26630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26640 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
26650 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
26660 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
26670 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
26680 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
26690 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
266a0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
266b0 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
266c0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
266d0 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72  Cell] -= leafCor
266e0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
266f0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
26700 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
26710 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
26720 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
26730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
26740 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
26750 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
26760 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
26770 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
26780 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
26790 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
267a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
267b0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
267c0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
267d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
267e0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
267f0 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
26800 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
26810 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26820 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26830 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
26840 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
26850 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
26860 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
26870 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
26880 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
26890 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
268a0 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
268b0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
268c0 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  ] = 4;.         
268d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
268e0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
268f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26900 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
26910 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
26920 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
26930 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
26940 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
26950 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
26960 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
26970 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
26980 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
26990 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
269a0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
269b0 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
269c0 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
269d0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
269e0 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
269f0 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
26a00 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
26a10 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
26a20 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
26a30 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
26a40 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
26a50 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
26a60 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
26a70 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
26a80 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
26a90 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
26aa0 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
26ab0 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
26ac0 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
26ad0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
26ae0 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
26af0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
26b00 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
26b10 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
26b20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
26b30 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
26b40 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
26b50 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
26b60 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
26b70 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
26b80 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
26b90 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
26ba0 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
26bb0 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
26bc0 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
26bd0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
26be0 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
26bf0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
26c00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
26c10 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
26c20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
26c30 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
26c40 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
26c50 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
26c60 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
26c70 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
26c80 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
26c90 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
26ca0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
26cb0 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
26cc0 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
26cd0 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
26ce0 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
26cf0 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
26d00 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
26d10 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
26d20 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
26d30 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
26d40 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
26d50 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
26d60 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
26d70 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
26d80 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
26d90 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
26da0 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
26db0 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
26dc0 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
26dd0 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
26de0 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
26df0 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
26e00 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
26e10 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
26e20 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
26e30 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
26e40 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
26e50 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
26e60 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
26e70 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
26e80 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
26e90 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
26ea0 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
26eb0 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
26ec0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
26ed0 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
26ee0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
26ef0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
26f00 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
26f10 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
26f20 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
26f30 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
26f40 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
26f50 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
26f60 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
26f70 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
26f80 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
26f90 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
26fa0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
26fb0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
26fc0 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
26fd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
26fe0 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
26ff0 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
27000 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
27010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27020 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
27030 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
27040 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
27050 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
27060 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
27070 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
27080 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
27090 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
270a0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
270b0 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
270c0 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
270d0 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
270e0 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
270f0 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
27100 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
27110 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
27120 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
27130 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
27140 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
27150 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
27160 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
27170 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
27180 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
27190 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
271a0 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
271b0 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
271c0 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
271d0 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
271e0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
271f0 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
27200 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65  0) or we are the
27210 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
27220 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
27230 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
27240 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
27250 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
27260 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
27270 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
27280 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
27290 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
272a0 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
272b0 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
272c0 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
272d0 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  ell==0) );..  /*
272e0 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
272f0 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
27300 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
27310 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
27320 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
27330 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
27340 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65  ageFlags = pPage
27350 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
27360 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
27370 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
27380 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
27390 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
273a0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
273b0 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pOld[i];.      p
273c0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
273d0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
273e0 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
273f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27400 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
27410 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
27420 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
27430 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
27440 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
27460 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
27470 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
27480 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
27490 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
274a0 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
274b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
274c0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
274d0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
274e0 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
274f0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
27500 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65    }.    zeroPage
27510 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
27520 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65  );.  }..  /* Fre
27530 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
27540 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
27550 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
27560 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
27570 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
27580 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
27590 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
275a0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
275b0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
275c0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
275d0 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
275e0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
275f0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27600 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
27610 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
27620 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
27630 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
27640 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
27650 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
27660 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
27670 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
27680 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
27690 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
276a0 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
276b0 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
276c0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
276d0 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
276e0 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
276f0 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
27700 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
27710 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
27720 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
27730 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
27740 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
27750 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
27760 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
27770 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
27780 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
27790 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
277a0 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
277b0 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
277c0 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
277d0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
277e0 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
277f0 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
27800 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
27810 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
27820 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
27830 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
27840 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
27850 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
27860 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
27870 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
27880 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
27890 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
278a0 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
278b0 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
278c0 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
278d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
278e0 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
278f0 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
27900 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
27910 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
27920 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
27930 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
27940 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
27950 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
27960 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
27970 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
27980 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
27990 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
279a0 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
279b0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
279c0 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
279d0 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
279e0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
279f0 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
27a00 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
27a10 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
27a20 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
27a30 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
27a40 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
27a50 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
27a60 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
27a70 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
27a80 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
27a90 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
27aa0 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
27ab0 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
27ac0 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
27ad0 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
27ae0 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
27af0 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
27b00 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
27b10 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
27b20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
27b30 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
27b40 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
27b50 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
27b60 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
27b70 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
27b80 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
27b90 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
27ba0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
27bb0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
27bc0 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
27bd0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
27be0 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
27bf0 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
27c00 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
27c10 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
27c20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
27c30 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
27c40 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
27c50 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
27c60 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61  oNew[i] );.    a
27c70 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
27c80 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
27c90 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
27ca0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
27cb0 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
27cc0 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
27cd0 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
27ce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
27cf0 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
27d00 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
27d10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27d20 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
27d30 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
27d40 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
27d50 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
27d60 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
27d70 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
27d80 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
27d90 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
27da0 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
27db0 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
27dc0 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
27dd0 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
27de0 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
27df0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
27e00 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
27e10 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
27e20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
27e30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
27e40 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
27e50 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
27e60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
27e70 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
27e80 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
27e90 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
27ea0 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
27eb0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
27ec0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
27ed0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
27ee0 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
27ef0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27f10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
27f20 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
27f30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27f40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27f50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a   }.#endif..    j
27f60 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
27f70 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
27f80 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
27f90 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
27fa0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
27fb0 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
27fc0 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
27fd0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
27fe0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
27ff0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e   */.    if( i<nN
28000 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20  ew-1 && j<nCell 
28010 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
28020 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
28030 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
28040 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
28050 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
28060 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
28070 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
28080 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
28090 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
280a0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
280b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
280c0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
280d0 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
280e0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   4);.        pTe
280f0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
28100 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
28110 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
28120 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
28130 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
28140 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
28150 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
28160 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
28170 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
28180 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
28190 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
281a0 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
281b0 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
281c0 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
281d0 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
281e0 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
281f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
28200 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
28210 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
28220 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
28230 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
28240 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
28250 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  -;.        sqlit
28260 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
28270 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
28280 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
28290 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 61 53       pCell = &aS
282a0 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20  pace[iSpace];.  
282b0 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c        fillInCell
282c0 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c  (pParent, pCell,
282d0 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
282e0 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20  , 0, 0, &sz);.  
282f0 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20        iSpace += 
28300 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
28310 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d  rt( iSpace<=pBt-
28320 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20  >pageSize*5 );. 
28330 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
28340 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28350 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
28360 34 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  4;.        pTemp
28370 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
28380 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  e];.        iSpa
28390 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
283a0 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
283b0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  <=pBt->pageSize*
283c0 35 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 );.        /* 
283d0 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
283e0 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
283f0 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
28400 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
28410 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
28420 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
28430 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
28440 69 74 27 73 20 72 65 70 6f 72 74 65 64 20 73 69  it's reported si
28450 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20  ze was 4.       
28460 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20   ** bytes, then 
28470 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  it may actually 
28480 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
28490 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  this .        **
284a0 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72   (see sqlite3Btr
284b0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
284c0 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
284d0 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
284e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
284f0 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 27 73 20  cell). But it's 
28500 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
28510 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
28520 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
28530 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
28540 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
28550 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
28560 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
28570 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
28580 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
28590 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
285a0 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
285b0 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
285c0 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
285d0 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
285e0 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
285f0 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
28600 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
28610 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
28620 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
28630 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
28640 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
28650 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
28660 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
28670 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
28680 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
28690 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
286a0 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
286b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
286c0 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
286d0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
286e0 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
286f0 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  emp, 4);.      i
28700 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28710 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
28720 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70  cleanup;.      p
28730 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
28740 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
28750 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70  ,nxDiv), pNew->p
28760 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
28770 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28780 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
28790 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
287a0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
287b0 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66  , and not a leaf
287c0 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20  -data tree,.    
287d0 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65    ** then update
287e0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
287f0 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66   with an entry f
28800 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
28810 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  page.      ** th
28820 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74  at the cell just
28830 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73   inserted points
28840 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20   to (if any)..  
28850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
28860 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28870 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b   && !leafData ){
28880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
28890 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72  rmapPutOvfl(pPar
288a0 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20  ent, nxDiv);.   
288b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
288c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
288d0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
288e0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
288f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
28900 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  if.      j++;.  
28910 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
28920 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
28930 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
28940 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
28950 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
28960 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
28970 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
28980 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63  )==0 ){.    memc
28990 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
289a0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70  ]->aData[8], &ap
289b0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
289c0 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a  ata[8], 4);.  }.
289d0 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
289e0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
289f0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
28a00 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
28a10 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
28a20 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
28a30 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
28a40 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
28a50 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
28a60 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
28a70 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
28a80 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
28a90 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
28aa0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
28ab0 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
28ac0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
28ad0 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
28ae0 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
28af0 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
28b00 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
28b10 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
28b20 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
28b30 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
28b40 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
28b50 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20  *.  ** Reparent 
28b60 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20  children of all 
28b70 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  cells..  */.  fo
28b80 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
28b90 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  ++){.    rc = re
28ba0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
28bb0 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  (apNew[i]);.    
28bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28bd0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
28be0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
28bf0 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
28c00 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29  ldPages(pParent)
28c10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
28c20 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
28c30 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20  ance_cleanup;.. 
28c40 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
28c50 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
28c60 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
28c70 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
28c80 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
28c90 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
28ca0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
28cb0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
28cc0 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
28cd0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
28ce0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
28cf0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
28d00 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
28d10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
28d20 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
28d30 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
28d40 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f  rent, 0);.  .  /
28d50 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
28d60 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
28d70 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
28d80 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
28d90 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
28da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
28db0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
28dc0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
28dd0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
28de0 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
28df0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28e00 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apNew[i]);.  }. 
28e10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
28e20 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28  rent);.  TRACE((
28e30 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
28e40 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d  ed with %d: old=
28e50 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d  %d new=%d cells=
28e60 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
28e70 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f   pPage->pgno, nO
28e80 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29  ld, nNew, nCell)
28e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
28ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
28eb0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
28ec0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
28ed0 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65  e of a btree whe
28ee0 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  n the root.** pa
28ef0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
28f00 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61  ells.  This is a
28f10 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
28f20 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a   make the tree.*
28f30 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f  * shallower by o
28f40 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ne level..*/.sta
28f50 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
28f60 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67  shallower(MemPag
28f70 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d  e *pPage){.  Mem
28f80 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
28f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28fa0 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65   only child page
28fb0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50   of pPage */.  P
28fc0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28fe0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
28ff0 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72  Child */.  int r
29000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29010 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
29020 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70  n code from subp
29030 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42  rocedures */.  B
29040 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29060 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65  * The main BTree
29070 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
29080 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  int mxCellPerPag
29090 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
290a0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
290b0 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65  f cells per page
290c0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
290d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
290e0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
290f0 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67  from pages being
29100 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
29110 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  nt *szCell;     
29120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29130 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
29140 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73   cells */..  ass
29150 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72  ert( pPage->pPar
29160 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ent==0 );.  asse
29170 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
29180 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29190 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
291a0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
291b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20  mutex) );.  pBt 
291c0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
291d0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20  mxCellPerPage = 
291e0 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20  MX_CELL(pBt);.  
291f0 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
29200 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  _malloc( mxCellP
29210 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
29220 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  8*)+sizeof(int))
29230 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
29240 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
29250 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
29260 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43  ell = (int*)&apC
29270 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
29280 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
29290 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
292a0 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
292b0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
292c0 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
292d0 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
292e0 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
292f0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
29300 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
29310 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
29320 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
29330 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
29340 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
29350 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
29360 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
29370 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
29380 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
29390 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
293a0 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
293b0 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
293c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
293d0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
293e0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
293f0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
29400 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
29410 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
29420 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
29430 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
29440 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
29450 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
29460 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
29470 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
29480 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
29490 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
294a0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
294b0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
294c0 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
294d0 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
294e0 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
294f0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
29500 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
29510 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
29520 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
29530 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
29540 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
29550 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
29560 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
29570 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
29580 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
29590 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
295a0 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
295b0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
295c0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
295d0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
295e0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
295f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29600 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65  gnoChild<=sqlite
29610 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
29620 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
29630 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
29640 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
29650 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  age(pPage->pBt, 
29660 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69  pgnoChild, &pChi
29670 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ld, 0);.    if( 
29680 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
29690 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
296a0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67     if( pPage->pg
296b0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  no==1 ){.      r
296c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
296d0 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  InitPage(pChild,
296e0 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69   pPage);.      i
296f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
29700 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
29710 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29720 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
29730 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  w==0 );.      if
29740 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
29750 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
29760 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66  /* The child inf
29770 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69  ormation will fi
29780 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  t on the root pa
29790 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20  ge, so do the.  
297a0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f        ** copy */
297b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
297c0 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65          zeroPage
297d0 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
297e0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
297f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
29800 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
29810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
29820 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  ell[i] = findCel
29830 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20  l(pChild,i);.   
29840 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d         szCell[i]
29850 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
29860 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d  Child, apCell[i]
29870 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29880 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67       assemblePag
29890 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
298a0 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20  >nCell, apCell, 
298b0 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20  szCell);.       
298c0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67   /* Copy the rig
298d0 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht-pointer of th
298e0 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70  e child to the p
298f0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
29900 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
29910 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
29920 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20  hdrOffset+8], . 
29930 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
29940 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61  yte(&pChild->aDa
29950 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66  ta[pChild->hdrOf
29960 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
29970 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
29980 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ld);.        TRA
29990 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
299a0 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20  ild %d transfer 
299b0 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  to page 1\n", pC
299c0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
299d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
299e0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
299f0 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  has more informa
29a00 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66  tion that will f
29a10 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a  it on the root..
29a20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
29a30 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62  ree is already b
29a40 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74  alanced.  Do not
29a50 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hing. */.       
29a60 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
29a70 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20  : child %d will 
29a80 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20  not fit on page 
29a90 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
29aa0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
29ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
29ac0 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61  emcpy(pPage->aDa
29ad0 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ta, pChild->aDat
29ae0 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  a, pPage->pBt->u
29af0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
29b00 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
29b10 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
29b20 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20  ->pParent = 0;. 
29b30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29b40 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
29b50 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Page, 0);.      
29b60 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
29b70 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66  TE_OK );.      f
29b80 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
29b90 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42  .      TRACE(("B
29ba0 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72  ALANCE: transfer
29bb0 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72   child %d into r
29bc0 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  oot %d\n",.     
29bd0 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d           pChild-
29be0 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67  >pgno, pPage->pg
29bf0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
29c00 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
29c10 6c 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a  ldPages(pPage);.
29c20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29c30 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
29c40 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
29c50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
29c60 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
29c70 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
29c80 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
29c90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
29ca0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a  ->nCell; i++){ .
29cb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
29cc0 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65  mapPutOvfl(pPage
29cd0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
29ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29d00 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
29d10 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d  lance;.        }
29d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
29d30 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73  endif.    releas
29d40 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
29d50 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62   }.end_shallow_b
29d60 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65  alance:.  sqlite
29d70 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  3_free(apCell);.
29d80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29d90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  ./*.** The root 
29da0 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
29db0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
29dc0 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65   happens, Create
29dd0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
29de0 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a  e and copy the.*
29df0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
29e00 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20  e root into the 
29e10 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b  child.  Then mak
29e20 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  e the root.** pa
29e30 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  ge an empty page
29e40 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64   with rightChild
29e50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
29e60 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20   new.** child.  
29e70 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62   Finally, call b
29e80 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28  alance_internal(
29e90 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69  ) on the new chi
29ea0 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69  ld.** to cause i
29eb0 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73  t to split..*/.s
29ec0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
29ed0 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
29ee0 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
29ef0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
29f00 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
29f10 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
29f20 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
29f30 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50  *pChild;    /* P
29f40 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
29f50 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
29f60 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
29f70 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
29f80 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
29f90 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
29fa0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
29fb0 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
29fc0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
29fd0 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f  eSize;     /* To
29fe0 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20  tal usable size 
29ff0 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75  of a page */.  u
2a000 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
2a010 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2a020 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2a030 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b   */.  u8 *cdata;
2a040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2a050 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c  tent of the chil
2a060 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2a070 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
2a080 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
2a090 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65  e header in pare
2a0a0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b  nt */.  int brk;
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2a0c0 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74  ffset to content
2a0d0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69   of first cell i
2a0e0 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61  n parent */..  a
2a0f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
2a100 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
2a110 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2a120 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42  erflow>0 );.  pB
2a130 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2a140 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a150 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2a160 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
2a170 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2a180 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c  Page(pBt, &pChil
2a190 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70  d, &pgnoChild, p
2a1a0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a  Page->pgno, 0);.
2a1b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a1c0 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  n rc;.  assert( 
2a1d0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a1e0 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
2a1f0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73  pDbPage) );.  us
2a200 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
2a210 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
2a220 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2a230 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
2a240 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62  ->hdrOffset;.  b
2a250 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
2a260 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63  ata[hdr+5]);.  c
2a270 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61  data = pChild->a
2a280 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63  Data;.  memcpy(c
2a290 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d  data, &data[hdr]
2a2a0 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  , pPage->cellOff
2a2b0 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
2a2c0 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70  ll-hdr);.  memcp
2a2d0 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26  y(&cdata[brk], &
2a2e0 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c  data[brk], usabl
2a2f0 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73  eSize-brk);.  as
2a300 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73  sert( pChild->is
2a310 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Init==0 );.  rc 
2a320 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2a330 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70  itPage(pChild, p
2a340 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2a350 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
2a360 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  eper_out;.  memc
2a370 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
2a380 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20  , pPage->aOvfl, 
2a390 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a3a0 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  *sizeof(pPage->a
2a3b0 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
2a3c0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
2a3d0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2a3e0 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d  w;.  if( pChild-
2a3f0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2a400 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
2a410 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2a420 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
2a430 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
2a440 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61  ;.  zeroPage(pPa
2a450 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
2a460 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
2a470 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2a480 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2a490 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
2a4a0 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54   pgnoChild);.  T
2a4b0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2a4c0 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
2a4d0 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
2a4e0 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
2a4f0 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  no));.#ifndef SQ
2a500 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2a510 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
2a520 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2a530 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20    int i;.    rc 
2a540 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
2a550 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50   pChild->pgno, P
2a560 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2a570 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ge->pgno);.    i
2a580 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2a590 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
2a5a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2a5b0 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
2a5c0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
2a5d0 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68  trmapPutOvfl(pCh
2a5e0 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  ild, i);.      i
2a5f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a600 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2a610 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2a620 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2a630 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
2a640 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a  onroot(pChild);.
2a650 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f  .balancedeeper_o
2a660 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
2a670 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74  e(pChild);.  ret
2a680 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a690 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70   Decide if the p
2a6a0 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20  age pPage needs 
2a6b0 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20  to be balanced. 
2a6c0 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73   If balancing is
2a6d0 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61  .** required, ca
2a6e0 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ll the appropria
2a6f0 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  te balancing rou
2a700 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
2a710 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
2a720 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2a730 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72  insert){.  int r
2a740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a760 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2a770 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2a780 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
2a790 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
2a7a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a7b0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2a7c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2a7d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a7e0 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
2a7f0 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ow>0 ){.      rc
2a800 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
2a810 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
2a820 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a830 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
2a840 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
2a850 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73    rc = balance_s
2a860 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b  hallower(pPage);
2a870 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2a880 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
2a890 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20  Overflow>0 || . 
2a8a0 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20         (!insert 
2a8b0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
2a8c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2a8d0 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20  leSize*2/3) ){. 
2a8e0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2a8f0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29  e_nonroot(pPage)
2a900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2a910 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a920 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2a930 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72  hecks all cursor
2a940 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
2a950 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  table pgnoRoot..
2a960 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f  ** If any of tho
2a970 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20  se cursors were 
2a980 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
2a990 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65  ag==0 in a diffe
2a9a0 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65  rent.** database
2a9b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64   connection (a d
2a9c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2a9d0 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74  on that shares t
2a9e0 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68  he pager.** cach
2a9f0 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  e with the curre
2aa00 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61  nt connection) a
2aa10 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f  nd that other co
2aa20 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nnection .** is 
2aa30 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55  not in the ReadU
2aa40 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74  ncommmitted stat
2aa50 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
2aa60 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tine returns .**
2aa70 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
2aa80 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f  **.** In additio
2aa90 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f  n to checking fo
2aaa0 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68  r read-locks (wh
2aab0 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ere a read-lock 
2aac0 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73  .** means a curs
2aad0 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  or opened with w
2aae0 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72  rFlag==0) this r
2aaf0 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65  outine also move
2ab00 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65 20 63  s.** all write c
2ab10 75 72 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74  ursors so that t
2ab20 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
2ab30 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   to the .** firs
2ab40 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f  t Cell on the ro
2ab50 6f 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  ot page.  This i
2ab60 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
2ab70 75 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a  use an insert .*
2ab80 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68  * or delete migh
2ab90 74 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d  t change the num
2aba0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
2abb0 61 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65  a page or delete
2abc0 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72  .** a page entir
2abd0 65 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f  ely and we do no
2abe0 74 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20  t want to leave 
2abf0 61 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20  any cursors .** 
2ac00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d  pointing to non-
2ac10 65 78 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f  existant pages o
2ac20 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  r cells..*/.stat
2ac30 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64  ic int checkRead
2ac40 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74  Locks(Btree *pBt
2ac50 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  ree, Pgno pgnoRo
2ac60 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
2ac70 78 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72  xclude){.  BtCur
2ac80 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72  sor *p;.  BtShar
2ac90 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65  ed *pBt = pBtree
2aca0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
2acb0 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 70   *db = pBtree->p
2acc0 53 71 6c 69 74 65 3b 0a 20 20 61 73 73 65 72 74  Sqlite;.  assert
2acd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2ace0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2acf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2ad00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ad10 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
2ad20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
2ad30 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
2ad40 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xt){.    if( p==
2ad50 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69  pExclude ) conti
2ad60 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2ad70 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ad80 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ALID ) continue;
2ad90 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
2ada0 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
2adb0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2adc0 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
2add0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ade0 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
2adf0 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a  Btree->pSqlite;.
2ae00 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65        if( dbOthe
2ae10 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  r==0 ||.        
2ae20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26   (dbOther!=db &&
2ae30 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73   (dbOther->flags
2ae40 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
2ae50 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29  committed)==0) )
2ae60 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2ae70 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2ae80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2ae90 65 20 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e  e if( p->pPage->
2aea0 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f  pgno!=p->pgnoRoo
2aeb0 74 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54  t ){.      moveT
2aec0 6f 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a  oRoot(p);.    }.
2aed0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2aee0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2aef0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
2af00 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54  cord into the BT
2af10 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ree.  The key is
2af20 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c   given by (pKey,
2af30 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65  nKey).** and the
2af40 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62   data is given b
2af50 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e  y (pData,nData).
2af60 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2af70 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20  used only to.** 
2af80 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c  define what tabl
2af90 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f  e the record sho
2afa0 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20  uld be inserted 
2afb0 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  into.  The curso
2afc0 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
2afd0 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
2afe0 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  m location..**.*
2aff0 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20  * For an INTKEY 
2b000 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20  table, only the 
2b010 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68  nKey value of th
2b020 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20  e key is used.  
2b030 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
2b040 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44  ed.  For a ZEROD
2b050 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70  ATA table, the p
2b060 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61  Data and nData a
2b070 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e  re both ignored.
2b080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2b090 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74  treeInsert(.  Bt
2b0a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0c0 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
2b0d0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
2b0e0 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  is cursor */.  c
2b0f0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2b100 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2b110 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   The key of the 
2b120 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2b130 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
2b140 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f  a, int nData,  /
2b150 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68  * The data of th
2b160 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
2b170 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
2b1a0 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61  tra 0 bytes to a
2b1b0 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
2b1c0 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61  .  int appendBia
2b1d0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2b1e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2b1f0 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61  s is likely an a
2b200 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ppend */.){.  in
2b210 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b  t rc;.  int loc;
2b220 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
2b230 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2b240 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
2b250 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
2b260 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2b270 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
2b280 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20  char *oldCell;. 
2b290 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2b2a0 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20  newCell = 0;..  
2b2b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2b2c0 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
2b2d0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2b2e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2b2f0 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2b300 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2b310 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69  efore doing an i
2b320 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 63 20  nsert */.    rc 
2b330 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2b340 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2b350 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2b360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
2b370 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
2b380 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2b390 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2b3a0 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
2b3b0 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2b3c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
2b3d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
2b3e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2b3f0 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  RM;   /* Cursor 
2b400 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69  not open for wri
2b410 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2b420 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2b430 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2b440 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2b450 43 75 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Cur) ){.    sqli
2b460 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2b470 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b480 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2b490 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2b4a0 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2b4b0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
2b4c0 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
2b4d0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2b4e0 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
2b4f0 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
2b500 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72  */.  clearCursor
2b510 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2b520 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54    if( .    SQLIT
2b530 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
2b540 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2b550 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2b560 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51  pCur)) ||.    SQ
2b570 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2b580 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2b590 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b  o(pCur, pKey, nK
2b5a0 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20  ey, appendBias, 
2b5b0 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20  &loc)).  ){.    
2b5c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2b5d0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
2b5e0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67   rc;.  }..  pPag
2b5f0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2b600 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b610 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
2b620 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
2b630 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
2b640 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61  !pPage->leafData
2b650 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e   );.  TRACE(("IN
2b660 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e  SERT: table=%d n
2b670 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25  key=%lld ndata=%
2b680 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c  d page=%d %s\n",
2b690 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2b6a0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c  >pgnoRoot, nKey,
2b6b0 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70   nData, pPage->p
2b6c0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  gno,.          l
2b6d0 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69  oc==0 ? "overwri
2b6e0 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79  te" : "new entry
2b6f0 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  "));.  assert( p
2b700 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2b710 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69    newCell = sqli
2b720 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 4d 58 5f 43  te3_malloc( MX_C
2b730 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
2b740 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
2b750 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2b760 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
2b770 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
2b780 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
2b790 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
2b7a0 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
2b7b0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2b7c0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2b7d0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2b7e0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2b7f0 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2b800 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2b810 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2b820 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2b830 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2b840 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2b850 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f  e ){.    int szO
2b860 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2b870 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2b880 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2b890 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
2b8a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b8b0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2b8c0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2b8d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
2b8e0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
2b8f0 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
2b900 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2b910 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69  Cur->idx);.    i
2b920 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2b930 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2b940 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c  newCell, oldCell
2b950 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 4);.    }.    
2b960 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65  szOld = cellSize
2b970 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  Ptr(pPage, oldCe
2b980 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  ll);.    rc = cl
2b990 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f  earCell(pPage, o
2b9a0 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28  ldCell);.    if(
2b9b0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
2b9c0 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43  nsert;.    dropC
2b9d0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2b9e0 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20  >idx, szOld);.  
2b9f0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
2ba00 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
2ba10 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
2ba20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2ba30 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b      pCur->idx++;
2ba40 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
2ba50 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nSize = 0;.  }el
2ba60 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2ba70 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
2ba80 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74   }.  rc = insert
2ba90 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2baa0 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  ->idx, newCell, 
2bab0 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  szNew, 0, 0);.  
2bac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bad0 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  K ) goto end_ins
2bae0 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  ert;.  rc = bala
2baf0 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20  nce(pPage, 1);. 
2bb00 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   /* sqlite3Btree
2bb10 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70  PageDump(pCur->p
2bb20 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2bb30 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20  ot, 1); */.  /* 
2bb40 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20  fflush(stdout); 
2bb50 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2bb60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
2bb70 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2bb80 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a    }.end_insert:.
2bb90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e    sqlite3_free(n
2bba0 65 77 43 65 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  ewCell);.  sqlit
2bbb0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2bbc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bbd0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2bbe0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
2bbf0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
2bc00 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
2bc10 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
2bc20 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
2bc30 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  dom location..*/
2bc40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2bc50 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2bc60 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2bc70 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2bc80 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67  ->pPage;.  unsig
2bc90 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2bca0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
2bcb0 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
2bcc0 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
2bcd0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
2bce0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2bcf0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
2bd00 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
2bd10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2bd20 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
2bd30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2bd40 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2bd50 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2bd60 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2bd70 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
2bd80 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20  a delete */.    
2bd90 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2bda0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2bdb0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2bdc0 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
2bdd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2bde0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2bdf0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2be00 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2be10 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2be20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2be30 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
2be40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
2be50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2be60 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73  OR;  /* The curs
2be70 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2be80 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a  ng to anything *
2be90 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75  /.  }.  if( !pCu
2bea0 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
2beb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2bec0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
2bed0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20  n SQLITE_PERM;  
2bee0 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e   /* Did not open
2bef0 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72   this cursor for
2bf00 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
2bf10 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
2bf20 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
2bf30 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
2bf40 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20  t, pCur) ){.    
2bf50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2bf60 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
2bf70 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
2bf80 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
2bf90 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
2bfa0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
2bfb0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
2bfc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
2bfd0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20  sor position (a 
2bfe0 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72  no-op if the cur
2bff0 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20  sor is not in . 
2c000 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49   ** CURSOR_REQUI
2c010 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e  RESEEK state) an
2c020 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69 74  d save the posit
2c030 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
2c040 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20  r cursors .  ** 
2c050 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2c060 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c   table. Then cal
2c070 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
2c080 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67  ite() on the pag
2c090 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
2c0a0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65  entry will be de
2c0b0 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f  leted from..  */
2c0c0 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20  .  if( .    (rc 
2c0d0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
2c0e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2c0f0 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2c100 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
2c110 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
2c120 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
2c130 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
2c140 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c150 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2c160 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e))!=0.  ){.    
2c170 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2c180 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
2c190 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   rc;.  }..  /* L
2c1a0 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77  ocate the cell w
2c1b0 69 74 68 69 6e 20 69 74 27 73 20 70 61 67 65 20  ithin it's page 
2c1c0 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20  and leave pCell 
2c1d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a  pointing to the.
2c1e0 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63    ** data. The c
2c1f0 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20  learCell() call 
2c200 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c  frees any overfl
2c210 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
2c220 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
2c230 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c  * cell. The cell
2c240 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c   itself is still
2c250 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20   intact..  */.  
2c260 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2c270 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2c280 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  x);.  if( !pPage
2c290 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2c2a0 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
2c2b0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20  te(pCell);.  }. 
2c2c0 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2c2d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2c2e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
2c2f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2c300 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
2c310 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  rc;.  }..  if( !
2c320 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c330 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
2c340 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
2c350 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
2c360 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
2c370 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
2c380 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
2c390 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
2c3a0 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
2c3b0 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
2c3c0 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
2c3d0 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
2c3e0 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
2c3f0 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
2c400 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
2c410 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
2c420 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
2c430 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
2c440 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
2c450 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
2c460 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
2c470 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
2c480 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75  r leafCur;.    u
2c490 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2c4a0 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e  ext;.    int szN
2c4b0 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ext;  /* The com
2c4c0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69 73  piler warning is
2c4d0 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69   wrong: szNext i
2c4e0 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20 20  s always .      
2c4f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
2c500 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
2c510 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61 6e   use.  Adding an
2c520 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2c530 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
2c540 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c         ** to sil
2c550 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  ence the compile
2c560 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65  r slows down the
2c570 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   code. */.    in
2c580 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75  t notUsed;.    u
2c590 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
2c5a0 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  mpCell = 0;.    
2c5b0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e  assert( !pPage->
2c5c0 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20  leafData );.    
2c5d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
2c5e0 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2c5f0 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
2c600 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2c610 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
2c620 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
2c630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c640 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2c650 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c660 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70  leafCur.pPage->p
2c670 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
2c680 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 52  E_OK ){.      TR
2c6a0 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2c6b0 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e  ble=%d delete in
2c6c0 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72  ternal from %d r
2c6d0 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66  eplace from leaf
2c6e0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
2c6f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2c700 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65   pPage->pgno, le
2c710 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e  afCur.pPage->pgn
2c720 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43  o));.      dropC
2c730 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2c740 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
2c750 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2c760 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
2c770 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72  findCell(leafCur
2c780 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
2c790 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  idx);.      szNe
2c7a0 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  xt = cellSizePtr
2c7b0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2c7c0 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73  pNext);.      as
2c7d0 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  sert( MX_CELL_SI
2c7e0 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b  ZE(pBt)>=szNext+
2c7f0 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43  4 );.      tempC
2c800 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ell = sqlite3_ma
2c810 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  lloc( MX_CELL_SI
2c820 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  ZE(pBt) );.     
2c830 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30   if( tempCell==0
2c840 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2c850 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2c890 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2c8a0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e  e, pCur->idx, pN
2c8b0 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c  ext-4, szNext+4,
2c8c0 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20   tempCell, 0);. 
2c8d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2c8e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c8f0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2c900 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2c910 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c  age, pCur->idx),
2c920 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20   pgnoChild);.   
2c930 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2c940 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pPage, 0);.    }
2c950 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c970 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72  dropCell(leafCur
2c980 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
2c990 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20  idx, szNext);.  
2c9a0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2c9b0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2c9c0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
2c9d0 6c 69 74 65 33 5f 66 72 65 65 28 74 65 6d 70 43  lite3_free(tempC
2c9e0 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ell);.    sqlite
2c9f0 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
2ca00 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72  pCursor(&leafCur
2ca10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ca20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2ca30 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2ca40 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2ca50 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67  .       pCur->pg
2ca60 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70  noRoot, pPage->p
2ca70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43  gno));.    dropC
2ca80 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2ca90 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
2caa0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2cab0 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
2cac0 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2cad0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2cae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
2caf0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2cb00 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
2cb10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
2cb20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2cb30 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54   Create a new BT
2cb40 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74  ree table.  Writ
2cb50 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20  e into *piTable 
2cb60 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2cb70 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  er for the root 
2cb80 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2cb90 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
2cba0 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73   type of type is
2cbb0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
2cbc0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2cbd0 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a  er.  Only the.**
2cbe0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
2cbf0 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63  s of flags are c
2cc00 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e  urrently in use.
2cc10 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66    Other values f
2cc20 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68  or.** flags migh
2cc30 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a  t not work:.**.*
2cc40 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b  *     BTREE_INTK
2cc50 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54  EY|BTREE_LEAFDAT
2cc60 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53  A     Used for S
2cc70 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72  QL tables with r
2cc80 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20  owid keys.**    
2cc90 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20   BTREE_ZERODATA 
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccb0 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e   Used for SQL in
2ccc0 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  dices.*/.static 
2ccd0 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54  int btreeCreateT
2cce0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2ccf0 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74  nt *piTable, int
2cd00 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61   flags){.  BtSha
2cd10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2cd20 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  t;.  MemPage *pR
2cd30 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  oot;.  Pgno pgno
2cd40 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Root;.  int rc;.
2cd50 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2cd60 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2cd70 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2cd80 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2cd90 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20  ansaction first 
2cda0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2cdb0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2cdc0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2cdd0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2cde0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2cdf0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2ce00 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64  eadOnly );..#ifd
2ce10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ce20 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
2ce30 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2ce40 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2ce50 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2ce60 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2ce70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2ce80 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74  .#else.  if( pBt
2ce90 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2cea0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76      Pgno pgnoMov
2ceb0 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  e;      /* Move 
2cec0 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d  a page here to m
2ced0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2cee0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
2cef0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2cf00 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67  Move; /* The pag
2cf10 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f  e to move to. */
2cf20 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e  ..    /* Creatin
2cf30 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61  g a new table ma
2cf40 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69  y probably requi
2cf50 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69  re moving an exi
2cf60 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20  sting database. 
2cf70 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f     ** to make ro
2cf80 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  om for the new t
2cf90 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e  ables root page.
2cfa0 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61   In case this pa
2cfb0 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20  ge turns.    ** 
2cfc0 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65  out to be an ove
2cfd0 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65  rflow page, dele
2cfe0 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  te all overflow 
2cff0 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a  page-map caches.
2d000 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f      ** held by o
2d010 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20  pen cursors..   
2d020 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   */.    invalida
2d030 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
2d040 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a  he(pBt);..    /*
2d050 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   Read the value 
2d060 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20  of meta[3] from 
2d070 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2d080 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20  determine where 
2d090 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
2d0a0 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2d0b0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e  table should go.
2d0c0 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20   meta[3] is the 
2d0d0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2d0e0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2d0f0 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20   so far, so the 
2d100 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  new root-page is
2d110 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20   (meta[3]+1)..  
2d120 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2d130 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2d140 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f  a(p, 4, &pgnoRoo
2d150 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
2d160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d170 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d180 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74    }.    pgnoRoot
2d190 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
2d1a0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
2d1b0 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
2d1c0 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
2d1d0 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
2d1e0 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
2d1f0 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
2d200 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f  /.    if( pgnoRo
2d210 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
2d220 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
2d230 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
2d240 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
2d250 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2d260 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
2d270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2d280 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
2d290 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
2d2a0 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
2d2b0 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
2d2c0 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
2d2d0 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
2d2e0 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
2d2f0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2d300 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
2d310 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
2d320 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
2d330 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
2d340 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
2d350 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2d360 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
2d370 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
2d380 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
2d390 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d3a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d3b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d3c0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
2d3d0 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
2d3e0 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
2d3f0 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
2d400 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
2d410 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2d420 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
2d430 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
2d440 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
2d450 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
2d460 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
2d470 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
2d480 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
2d490 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
2d4a0 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
2d4b0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
2d4c0 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
2d4d0 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
2d4e0 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
2d4f0 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
2d500 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
2d510 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
2d520 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
2d530 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
2d540 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
2d550 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
2d560 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
2d570 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
2d580 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
2d590 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
2d5a0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2d5b0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2d5c0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2d5d0 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2d5e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d5f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d600 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d610 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
2d620 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
2d630 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
2d640 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
2d650 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d660 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
2d670 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
2d680 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2d690 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2d6a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d6b0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2d6c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d6d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2d6e0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
2d6f0 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
2d700 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2d710 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
2d720 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2d730 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2d740 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2d750 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d770 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d780 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2d790 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d7a0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2d7b0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2d7c0 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2d7d0 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b  Page, pgnoMove);
2d7e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2d7f0 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20  ge(pRoot);..    
2d800 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
2d810 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  page at pgnoRoot
2d820 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
2d830 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d860 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2d870 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
2d880 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
2d890 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2d8a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d8b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d8c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d8d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d8e0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2d8f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2d900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d910 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2d920 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2d930 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2d950 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2d960 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2d970 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2d980 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2d990 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2d9a0 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2d9b0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2d9c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2d9d0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2d9e0 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2d9f0 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2da00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2da10 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2da20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2da30 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2da40 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2da50 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2da60 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2da70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2da80 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2da90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2daa0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2dab0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2dac0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2dad0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2dae0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2daf0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2db00 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2db10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2db20 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2db30 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
2db40 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
2db50 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
2db60 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
2db70 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2db80 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2db90 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
2dba0 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
2dbb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2dbc0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2dbd0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2dbe0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2dbf0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2dc00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2dc10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
2dc20 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
2dc30 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70  CreateTable(p, p
2dc40 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a  iTable, flags);.
2dc50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2dc60 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
2dc70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
2dc80 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ase the given da
2dc90 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
2dca0 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e  all its children
2dcb0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
2dcc0 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
2dcd0 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
2dce0 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61   int clearDataba
2dcf0 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  sePage(.  BtShar
2dd00 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
2dd10 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
2dd20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2dd30 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e  e table */.  Pgn
2dd40 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
2dd50 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2dd60 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20  r to clear */.  
2dd70 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2dd80 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
2dd90 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20  page.  NULL for 
2dda0 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e  the root */.  in
2ddb0 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20  t freePageFlag  
2ddc0 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
2ddd0 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a  e page if true *
2dde0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2ddf0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
2de00 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2de10 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
2de20 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
2de30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2de40 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2de50 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71  );.  if( pgno>sq
2de60 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
2de70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
2de80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2de90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2dea0 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
2deb0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2dec0 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
2ded0 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  , pParent);.  if
2dee0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2def0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2df00 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
2df10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
2df20 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  +){.    pCell = 
2df30 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2df40 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
2df50 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2df60 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2df70 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
2df80 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
2df90 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31  Page->pParent, 1
2dfa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2dfb0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2dfc0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2dfd0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
2dfe0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2dff0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2e000 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2e010 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2e020 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
2e030 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
2e040 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2e050 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
2e060 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2e070 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  8]), pPage->pPar
2e080 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ent, 1);.    if(
2e090 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2e0a0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2e0b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
2e0c0 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
2e0d0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2e0e0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  age);.  }else if
2e0f0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
2e100 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2e110 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b  >pDbPage))==0 ){
2e120 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
2e130 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
2e140 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
2e150 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
2e160 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
2e170 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2e180 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2e190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2e1a0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2e1b0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
2e1c0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
2e1d0 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
2e1e0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
2e1f0 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
2e200 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
2e210 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
2e220 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
2e230 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2e240 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
2e250 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
2e260 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2e270 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2e280 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2e290 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2e2a0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
2e2b0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
2e2c0 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
2e2d0 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
2e2e0 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
2e2f0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
2e300 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
2e310 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2e320 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e  nt iTable){.  in
2e330 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
2e340 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2e350 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2e360 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ter(p);.  if( p-
2e370 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2e380 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
2e390 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2e3a0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2e3b0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2e3c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
2e3d0 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  c = checkReadLoc
2e3e0 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29  ks(p, iTable, 0)
2e3f0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
2e400 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
2e410 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  o do */.  }else 
2e420 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
2e430 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2e440 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c  ors(pBt, iTable,
2e450 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e   0)) ){.    /* n
2e460 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
2e470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2e480 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2e490 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
2e4a0 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Table, 0, 0);.  
2e4b0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
2e4c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2e4d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e4e0 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  Erase all inform
2e4f0 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65  ation in a table
2e500 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f   and add the roo
2e510 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
2e520 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73  o.** the freelis
2e530 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20  t.  Except, the 
2e540 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e  root of the prin
2e550 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ciple table (the
2e560 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20   one on.** page 
2e570 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65  1) is never adde
2e580 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2e590 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
2e5a0 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
2e5b0 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
2e5c0 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
2e5d0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73  any open.** curs
2e5e0 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2e5f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56  ..**.** If AUTOV
2e600 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64  ACUUM is enabled
2e610 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74   and the page at
2e620 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74   iTable is not t
2e630 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20  he last.** root 
2e640 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2e650 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2e660 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2e670 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ge .** in the da
2e680 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2e690 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c  oved into the sl
2e6a0 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
2e6b0 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c  pied by.** iTabl
2e6c0 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20  e and that last 
2e6d0 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
2e6e0 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61  cupied by the la
2e6f0 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  st root page.** 
2e700 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2e710 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64  freelist instead
2e720 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20   of iTable.  In 
2e730 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a  this say, all.**
2e740 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20   root pages are 
2e750 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69  kept at the begi
2e760 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
2e770 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
2e780 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72  h.** is necessar
2e790 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d  y for AUTOVACUUM
2e7a0 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20   to work right. 
2e7b0 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
2e7c0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   to the .** page
2e7d0 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65   number that use
2e7e0 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74  d to be the last
2e7f0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2e800 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a  e file before.**
2e810 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e   the move.  If n
2e820 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65  o page gets move
2e830 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  d, *piMoved is s
2e840 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20  et to 0..** The 
2e850 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2e860 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65  s recorded in me
2e870 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61  ta[3] and the va
2e880 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33  lue of.** meta[3
2e890 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20  ] is updated by 
2e8a0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
2e8b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
2e8c0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
2e8d0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2e8e0 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
2e8f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
2e900 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2e910 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2e920 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
2e930 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2e940 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2e950 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
2e960 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2e970 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2e980 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2e990 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2e9a0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2e9b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ROR;.  }..  /* I
2e9c0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
2e9d0 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20  drop a table if 
2e9e0 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20  any cursors are 
2e9f0 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  open on the.  **
2ea00 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
2ea10 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75  is because in au
2ea20 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
2ea30 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20  he backend may. 
2ea40 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65   ** need to move
2ea50 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61   another root-pa
2ea60 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70  ge to fill a gap
2ea70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
2ea80 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70  eted.  ** root p
2ea90 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20  age. If an open 
2eaa0 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
2eab0 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f   this page a pro
2eac0 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  blem would .  **
2ead0 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69   occur..  */.  i
2eae0 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  f( pBt->pCursor 
2eaf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2eb00 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
2eb10 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2eb20 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
2eb30 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
2eb40 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  &pPage, 0);.  if
2eb50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2eb60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2eb70 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
2eb80 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66  p, iTable);.  if
2eb90 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65  ( rc ){.    rele
2eba0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2ebb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ebc0 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d   }..  *piMoved =
2ebd0 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c   0;..  if( iTabl
2ebe0 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51  e>1 ){.#ifdef SQ
2ebf0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2ec00 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72  CUUM.    rc = fr
2ec10 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2ec20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ec30 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  Page);.#else.   
2ec40 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2ec50 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67  cuum ){.      Pg
2ec60 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a  no maxRootPgno;.
2ec70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ec80 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2ec90 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e  , 4, &maxRootPgn
2eca0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2ecb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ecc0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2ecd0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2ece0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ecf0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2ed00 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74   iTable==maxRoot
2ed10 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
2ed20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
2ed30 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73  being dropped is
2ed40 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
2ed50 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2ed60 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
2ed70 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
2ed80 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68 65  atabase, put the
2ed90 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68   root page on th
2eda0 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20  e free list. .  
2edb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2edc0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2edd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2ede0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2edf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ee00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ee10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ee20 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2ee30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ee40 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2ee50 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64   being dropped d
2ee60 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65  oes not have the
2ee70 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
2ee80 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
2ee90 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
2eea0 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68  base. So move th
2eeb0 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  e page that does
2eec0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20   into the .     
2eed0 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62     ** gap left b
2eee0 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f  y the deleted ro
2eef0 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ot-page..       
2ef00 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   */.        MemP
2ef10 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20  age *pMove;.    
2ef20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ef30 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2ef40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ef50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
2ef60 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
2ef70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2ef80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ef90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2efa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2efb0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2efc0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2efd0 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f  , pMove, PTRMAP_
2efe0 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61  ROOTPAGE, 0, iTa
2eff0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ble);.        re
2f000 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
2f010 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f030 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2f040 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2f050 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f060 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2f070 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2f080 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
2f090 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f0a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f0b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f0c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f0d0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2f0e0 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
2f0f0 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
2f100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f120 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2f130 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2f140 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
2f150 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
2f160 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2f170 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
2f180 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
2f190 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
2f1a0 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
2f1b0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2f1c0 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
2f1d0 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
2f1e0 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
2f1f0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
2f200 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
2f210 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
2f220 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
2f230 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
2f240 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
2f250 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
2f260 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
2f270 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
2f280 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
2f290 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2f2a0 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
2f2b0 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
2f2c0 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
2f2d0 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
2f2e0 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  O(pBt, maxRootPg
2f2f0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  no) ){.        m
2f300 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2f310 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2f320 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21  rt( maxRootPgno!
2f330 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2f340 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  GE(pBt) );..    
2f350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f360 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
2f370 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29   4, maxRootPgno)
2f380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f390 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2f3a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  (pPage);.      r
2f3b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2f3c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2f3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2f3e0 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  If sqlite3BtreeD
2f3f0 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c  ropTable was cal
2f400 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  led on page 1. *
2f410 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  /.    zeroPage(p
2f420 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59  Page, PTF_INTKEY
2f430 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20  |PTF_LEAF );.   
2f440 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2f450 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
2f460 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
2f470 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
2f480 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2f490 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
2f4a0 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
2f4b0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
2f4c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
2f4d0 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65  = btreeDropTable
2f4e0 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f  (p, iTable, piMo
2f4f0 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ved);.  sqlite3B
2f500 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2f510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2f520 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65  *.** Read the me
2f530 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ta-information o
2f540 75 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ut of a database
2f550 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a   file.  Meta[0].
2f560 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
2f570 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63   of free pages c
2f580 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
2f590 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
2f5a0 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65  1].** through me
2f5b0 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c  ta[15] are avail
2f5c0 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20  able for use by 
2f5d0 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20  higher layers.  
2f5e0 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65  Meta[0].** is re
2f5f0 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68  ad-only, the oth
2f600 65 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  ers are read/wri
2f610 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73  te..** .** The s
2f620 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62  chema layer numb
2f630 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20  ers meta values 
2f640 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74  differently.  At
2f650 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c   the schema.** l
2f660 61 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65  ayer (and the Se
2f670 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64  tCookie and Read
2f680 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20  Cookie opcodes) 
2f690 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
2f6a0 20 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e   free pages is n
2f6b0 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20  ot visible.  So 
2f6c0 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65  Cookie[0] is the
2f6d0 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d   same as Meta[1]
2f6e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f6f0 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72  BtreeGetMeta(Btr
2f700 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
2f710 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44  u32 *pMeta){.  D
2f720 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
2f730 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
2f740 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
2f750 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2f760 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
2f770 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
2f780 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67  );..  /* Reading
2f790 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c   a meta-data val
2f7a0 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65  ue requires a re
2f7b0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
2f7c0 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a  1 (and hence.  *
2f7d0 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
2f7e0 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72  ter table. We gr
2f7f0 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67  ab this lock reg
2f800 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2f810 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74  er or.  ** not t
2f820 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  he SQLITE_ReadUn
2f830 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
2f840 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65  s set (the table
2f850 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a   rooted at page.
2f860 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65    ** 1 is treate
2f870 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  d as a special c
2f880 61 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c  ase by queryTabl
2f890 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b  eLock() and lock
2f8a0 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20  Table())..  */. 
2f8b0 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65   rc = queryTable
2f8c0 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f  Lock(p, 1, READ_
2f8d0 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
2f8e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f8f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2f900 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
2f910 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
2f920 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
2f930 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20  idx<=15 );.  rc 
2f940 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2f950 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31  t(pBt->pPager, 1
2f960 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
2f970 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
2f980 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2f990 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2f9a0 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 28 75  ;.  }.  pP1 = (u
2f9b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
2f9c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
2f9d0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  ta(pDbPage);.  *
2f9e0 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65  pMeta = get4byte
2f9f0 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
2fa00 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  ]);.  sqlite3Pag
2fa10 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
2fa20 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76  ;..  /* If autov
2fa30 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62  acuumed is disab
2fa40 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
2fa50 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79  d but we are try
2fa60 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63  ing to .  ** acc
2fa70 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75  ess an autovacuu
2fa80 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  med database, th
2fa90 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61  en make the data
2faa0 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a  base readonly. .
2fab0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2fac0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2fad0 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20  UM.  if( idx==4 
2fae0 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42  && *pMeta>0 ) pB
2faf0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
2fb00 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72  .#endif..  /* Gr
2fb10 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  ab the read-lock
2fb20 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2fb30 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28   rc = lockTable(
2fb40 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2fb50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2fb60 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2fb70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2fb80 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72  Write meta-infor
2fb90 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f  mation back into
2fba0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2fbb0 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65  Meta[0] is.** re
2fbc0 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20  ad-only and may 
2fbd0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a  not be written..
2fbe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2fbf0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74  reeUpdateMeta(Bt
2fc00 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ree *p, int idx,
2fc10 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42   u32 iMeta){.  B
2fc20 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2fc30 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
2fc40 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69  d char *pP1;.  i
2fc50 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
2fc60 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d   idx>=1 && idx<=
2fc70 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  15 );.  sqlite3B
2fc80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
2fc90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2fca0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2fcb0 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2fcc0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2fcd0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2fce0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
2fcf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2fd00 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20  ->pPage1!=0 );. 
2fd10 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50     pP1 = pBt->pP
2fd20 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
2fd30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fd40 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
2fd50 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2fd60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fd70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
2fd80 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
2fd90 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b   idx*4], iMeta);
2fda0 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d  .      if( idx==
2fdb0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  7 ){.        ass
2fdc0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2fdd0 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30  cuum || iMeta==0
2fde0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2fdf0 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20  rt( iMeta==0 || 
2fe00 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20  iMeta==1 );.    
2fe10 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
2fe20 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20  uum = iMeta;.   
2fe30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2fe40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2fe50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
2fe60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2fe70 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74  urn the flag byt
2fe80 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  e at the beginni
2fe90 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ng of the page t
2fea0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
2feb0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  * is currently p
2fec0 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69  ointing to..*/.i
2fed0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2fee0 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
2fef0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2ff00 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53   What about CURS
2ff10 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73  OR_REQUIRESEEK s
2ff20 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e  tate? Probably n
2ff30 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  eed to call.  **
2ff40 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2ff50 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
2ff60 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d  here..  */.  Mem
2ff70 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2ff80 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
2ff90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ffa0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2ffb0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2ffc0 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70  return pPage ? p
2ffd0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2ffe0 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20  e->hdrOffset] : 
2fff0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  0;.}.../*.** Ret
30000 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73  urn the pager as
30010 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
30020 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75  BTree.  This rou
30030 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
30040 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
30050 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
30060 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65  */.Pager *sqlite
30070 33 42 74 72 65 65 50 61 67 65 72 28 42 74 72 65  3BtreePager(Btre
30080 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
30090 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
300a0 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e  eld(p->pSqlite->
300b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
300c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
300d0 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
300e0 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
300f0 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  n p->pBt->pPager
30100 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
30110 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
30120 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41  TY_CHECK./*.** A
30130 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20  ppend a message 
30140 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
30150 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  sage string..*/.
30160 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
30170 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e  kAppendMsg(.  In
30180 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
30190 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31  k,.  char *zMsg1
301a0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
301b0 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29  zFormat,.  ....)
301c0 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
301d0 20 20 63 68 61 72 20 2a 7a 4d 73 67 32 3b 0a 20    char *zMsg2;. 
301e0 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78   if( !pCheck->mx
301f0 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
30200 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b  pCheck->mxErr--;
30210 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b  .  pCheck->nErr+
30220 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  +;.  va_start(ap
30230 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d  , zFormat);.  zM
30240 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  sg2 = sqlite3VMP
30250 72 69 6e 74 66 28 30 2c 20 7a 46 6f 72 6d 61 74  rintf(0, zFormat
30260 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
30270 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31  ap);.  if( zMsg1
30280 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20 22 22  ==0 ) zMsg1 = ""
30290 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  ;.  if( pCheck->
302a0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63  zErrMsg ){.    c
302b0 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65  har *zOld = pChe
302c0 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20  ck->zErrMsg;.   
302d0 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
302e0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
302f0 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65  3SetString(&pChe
30300 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c  ck->zErrMsg, zOl
30310 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20  d, "\n", zMsg1, 
30320 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29  zMsg2, (char*)0)
30330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
30340 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73  ee(zOld);.  }els
30350 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e{.    sqlite3Se
30360 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
30370 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c  >zErrMsg, zMsg1,
30380 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30   zMsg2, (char*)0
30390 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
303a0 5f 66 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a  _free(zMsg2);.}.
303b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
303c0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
303d0 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
303e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
303f0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
30400 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65  .** Add 1 to the
30410 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
30420 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e   for page iPage.
30430 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
30440 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72   second.** refer
30450 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
30460 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d  , add an error m
30470 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b  essage to pCheck
30480 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65  ->zErrMsg..** Re
30490 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
304a0 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72  are 2 ore more r
304b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
304c0 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a   page and 0 if.*
304d0 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
304e0 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65   first reference
304f0 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   to the page..**
30500 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74  .** Also check t
30510 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
30520 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73  ber is in bounds
30530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30540 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69  checkRef(Integri
30550 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e  tyCk *pCheck, in
30560 74 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a  t iPage, char *z
30570 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20  Context){.  if( 
30580 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
30590 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65  n 1;.  if( iPage
305a0 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c  >pCheck->nPage |
305b0 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20  | iPage<0 ){.   
305c0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
305d0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
305e0 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20  , "invalid page 
305f0 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67  number %d", iPag
30600 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
30610 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65  ;.  }.  if( pChe
30620 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d  ck->anRef[iPage]
30630 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ==1 ){.    check
30640 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30650 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64  , zContext, "2nd
30660 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
30670 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
30680 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
30690 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43 68  }.  return  (pCh
306a0 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
306b0 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64  ]++)>1;.}..#ifnd
306c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
306d0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
306e0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65  Check that the e
306f0 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
30700 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65  ter-map for page
30710 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20   iChild maps to 
30720 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74  .** page iParent
30730 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70  , pointer type p
30740 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20  trType. If not, 
30750 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20  append an error 
30760 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43  message.** to pC
30770 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  heck..*/.static 
30780 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70  void checkPtrmap
30790 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
307a0 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e  *pCheck,   /* In
307b0 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f  tegrity check co
307c0 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  ntext */.  Pgno 
307d0 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20  iChild,         
307e0 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20    /* Child page 
307f0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65  number */.  u8 e
30800 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
30810 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70     /* Expected p
30820 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20  ointer map type 
30830 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e  */.  Pgno iParen
30840 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  t,          /* E
30850 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
30860 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20  map parent page 
30870 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
30880 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
30890 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65     /* Context de
308a0 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20  scription (used 
308b0 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a  for error msg) *
308c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
308d0 20 75 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b   u8 ePtrmapType;
308e0 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50  .  Pgno iPtrmapP
308f0 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70  arent;..  rc = p
30900 74 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d  trmapGet(pCheck-
30910 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65  >pBt, iChild, &e
30920 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74  PtrmapType, &iPt
30930 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  rmapParent);.  i
30940 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30950 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
30960 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
30970 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64  Context, "Failed
30980 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20   to read ptrmap 
30990 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29  key=%d", iChild)
309a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
309b0 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70  }..  if( ePtrmap
309c0 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69  Type!=eType || i
309d0 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50  PtrmapParent!=iP
309e0 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65  arent ){.    che
309f0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30a00 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
30a10 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61       "Bad ptr ma
30a20 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65  p entry key=%d e
30a30 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20  xpected=(%d,%d) 
30a40 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20  got=(%d,%d)", . 
30a50 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79       iChild, eTy
30a60 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74  pe, iParent, ePt
30a70 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61  rmapType, iPtrma
30a80 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
30a90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
30aa0 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
30ab0 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
30ac0 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  t or of an overf
30ad0 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  low page list..*
30ae0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
30af0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
30b00 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73  s on the list is
30b10 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   N..*/.static vo
30b20 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20  id checkList(.  
30b30 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
30b40 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69  eck,  /* Integri
30b50 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74  ty checking cont
30b60 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46  ext */.  int isF
30b70 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  reeList,       /
30b80 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65  * True for a fre
30b90 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f  elist.  False fo
30ba0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  r overflow page 
30bb0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  list */.  int iP
30bc0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
30bd0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
30be0 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e  or first page in
30bf0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
30c00 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
30c10 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
30c20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
30c30 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
30c40 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
30c50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
30c60 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
30c70 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sages */.){.  in
30c80 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63  t i;.  int expec
30c90 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69  ted = N;.  int i
30ca0 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20  First = iPage;. 
30cb0 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20   while( N-- > 0 
30cc0 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
30cd0 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a   ){.    DbPage *
30ce0 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75  pOvflPage;.    u
30cf0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f  nsigned char *pO
30d00 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28  vflData;.    if(
30d10 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20   iPage<1 ){.    
30d20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30d30 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30d40 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20  t,.         "%d 
30d50 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73  of %d pages miss
30d60 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f  ing from overflo
30d70 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  w list starting 
30d80 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  at %d",.        
30d90 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c    N+1, expected,
30da0 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20   iFirst);.      
30db0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
30dc0 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
30dd0 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f  heck, iPage, zCo
30de0 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a  ntext) ) break;.
30df0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
30e00 61 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e  agerGet(pCheck->
30e10 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50  pPager, (Pgno)iP
30e20 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29  age, &pOvflPage)
30e30 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
30e40 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30e50 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c   zContext, "fail
30e60 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25  ed to get page %
30e70 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
30e80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
30e90 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28     pOvflData = (
30ea0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
30eb0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
30ec0 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a  ata(pOvflPage);.
30ed0 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69      if( isFreeLi
30ee0 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
30ef0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  n = get4byte(&pO
30f00 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66  vflData[4]);.#if
30f10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30f20 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30f30 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
30f40 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
30f50 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
30f60 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61  rmap(pCheck, iPa
30f70 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
30f80 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
30f90 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
30fa0 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43  f.      if( n>pC
30fb0 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  heck->pBt->usabl
30fc0 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20  eSize/4-8 ){.   
30fd0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
30fe0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30ff0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  text,.          
31000 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20   "freelist leaf 
31010 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e  count too big on
31020 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
31030 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a  );.        N--;.
31040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31050 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
31060 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
31070 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67     Pgno iFreePag
31080 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  e = get4byte(&pO
31090 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  vflData[8+i*4]);
310a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
310b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
310c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
310d0 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
310e0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
310f0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
31100 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
31110 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
31120 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
31130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
31140 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
31150 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
31160 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e   iFreePage, zCon
31170 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  text);.        }
31180 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b  .        N -= n;
31190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
311a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
311b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
311c0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
311d0 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
311e0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
311f0 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65  vacuum and iPage
31200 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
31210 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69  .      ** page i
31220 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  n this overflow 
31230 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74  list, check that
31240 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31250 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20   entry for.     
31260 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
31270 67 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69  g page matches i
31280 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Page..      */. 
31290 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
312a0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
312b0 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20   && N>0 ){.     
312c0 20 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28     i = get4byte(
312d0 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20  pOvflData);.    
312e0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
312f0 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41  pCheck, i, PTRMA
31300 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61  P_OVERFLOW2, iPa
31310 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
31320 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
31330 64 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20  dif.    iPage = 
31340 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61  get4byte(pOvflDa
31350 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
31360 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
31370 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Page);.  }.}.#en
31380 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
31390 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
313a0 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
313b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
313c0 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
313d0 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69   Do various sani
313e0 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73  ty checks on a s
313f0 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20  ingle page of a 
31400 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tree.  Return.**
31410 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e   the tree depth.
31420 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74    Root pages ret
31430 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20  urn 0.  Parents 
31440 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a  of root pages.**
31450 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73   return 1, and s
31460 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  o forth..** .** 
31470 54 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65  These checks are
31480 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   done:.**.**    
31490 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    1.  Make sure 
314a0 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66  that cells and f
314b0 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74  reeblocks do not
314c0 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20   overlap.**     
314d0 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65       but combine
314e0 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63   to completely c
314f0 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a  over the page..*
31500 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20  *  NO  2.  Make 
31510 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61  sure cell keys a
31520 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20  re in order..** 
31530 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75   NO  3.  Make su
31540 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73  re no key is les
31550 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
31560 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a  to zLowerBound..
31570 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65  **  NO  4.  Make
31580 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
31590 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
315a0 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42  equal to zUpperB
315b0 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e  ound..**      5.
315c0 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65    Check the inte
315d0 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f  grity of overflo
315e0 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20  w pages..**     
315f0 20 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79   6.  Recursively
31600 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50   call checkTreeP
31610 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64  age on all child
31620 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20  ren..**      7. 
31630 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
31640 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68   depth of all ch
31650 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61  ildren is the sa
31660 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20  me..**      8.  
31670 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70  Make sure this p
31680 61 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  age is at least 
31690 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65  33% full or else
316a0 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20   it is.**       
316b0 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74     the root of t
316c0 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  he tree..*/.stat
316d0 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65  ic int checkTree
316e0 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74  Page(.  Integrit
316f0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
31700 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65   Context for the
31710 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f   sanity check */
31720 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
31730 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31740 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
31750 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  age to check */.
31760 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
31770 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  nt,     /* Paren
31780 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72  t page */.  char
31790 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74   *zParentContext
317a0 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74    /* Parent cont
317b0 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ext */.){.  MemP
317c0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  age *pPage;.  in
317d0 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20  t i, rc, depth, 
317e0 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20  d2, pgno, cnt;. 
317f0 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74   int hdr, cellSt
31800 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  art;.  int nCell
31810 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20  ;.  u8 *data;.  
31820 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
31830 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
31840 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74  .  char zContext
31850 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68  [100];.  char *h
31860 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  it;..  sqlite3_s
31870 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
31880 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
31890 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c  xt, "Page %d: ",
318a0 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43   iPage);..  /* C
318b0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
318c0 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20  ge exists.  */. 
318d0 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70   pBt = pCheck->p
318e0 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  Bt;.  usableSize
318f0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
31900 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  ze;.  if( iPage=
31910 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
31920 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
31930 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61  heck, iPage, zPa
31940 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72  rentContext) ) r
31950 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
31960 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
31970 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50  eGetPage(pBt, (P
31980 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67  gno)iPage, &pPag
31990 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
319a0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
319b0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
319c0 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  ,.       "unable
319d0 20 74 6f 20 67 65 74 20 74 68 65 20 70 61 67 65   to get the page
319e0 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22  . error code=%d"
319f0 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72  , rc);.    retur
31a00 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
31a10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
31a20 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
31a30 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20 29 7b   pParent))!=0 ){
31a40 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
31a50 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31a60 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
31a70 20 20 20 20 20 20 20 20 20 20 22 73 71 6c 69 74            "sqlit
31a80 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
31a90 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20  ) returns error 
31aa0 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20  code %d", rc);. 
31ab0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31ac0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
31ad0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  n 0;.  }..  /* C
31ae0 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65  heck out all the
31af0 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64   cells..  */.  d
31b00 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28  epth = 0;.  for(
31b10 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
31b20 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  ell && pCheck->m
31b30 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xErr; i++){.    
31b40 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69  u8 *pCell;.    i
31b50 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49  nt sz;.    CellI
31b60 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f  nfo info;..    /
31b70 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61 64 20  * Check payload 
31b80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20  overflow pages. 
31b90 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
31ba0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31bb0 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
31bc0 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
31bd0 20 20 20 20 22 4f 6e 20 74 72 65 65 20 70 61 67      "On tree pag
31be0 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c  e %d cell %d: ",
31bf0 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   iPage, i);.    
31c00 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
31c10 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 73  (pPage,i);.    s
31c20 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
31c30 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
31c40 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
31c50 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74    sz = info.nDat
31c60 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  a;.    if( !pPag
31c70 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b  e->intKey ) sz +
31c80 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  = info.nKey;.   
31c90 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66   assert( sz==inf
31ca0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
31cb0 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c    if( sz>info.nL
31cc0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  ocal ){.      in
31cd0 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20  t nPage = (sz - 
31ce0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73  info.nLocal + us
31cf0 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75  ableSize - 5)/(u
31d00 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
31d10 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
31d20 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
31d30 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
31d40 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20  flow]);.#ifndef 
31d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31d60 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
31d70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31d80 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31d90 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31da0 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
31db0 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67  _OVERFLOW1, iPag
31dc0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31dd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31de0 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68     checkList(pCh
31df0 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c  eck, 0, pgnoOvfl
31e00 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , nPage, zContex
31e10 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  t);.    }..    /
31e20 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f  * Check sanity o
31e30 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67  f left child pag
31e40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
31e50 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31e60 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  {.      pgno = g
31e70 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
31e80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31e90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31ea0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
31eb0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
31ec0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
31ed0 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
31ee0 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
31ef0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31f00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31f10 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65     d2 = checkTre
31f20 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e  ePage(pCheck,pgn
31f30 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74  o,pPage,zContext
31f40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30  );.      if( i>0
31f50 20 26 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b   && d2!=depth ){
31f60 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
31f70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31f80 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64  zContext, "Child
31f90 20 70 61 67 65 20 64 65 70 74 68 20 64 69 66 66   page depth diff
31fa0 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers");.      }. 
31fb0 20 20 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b       depth = d2;
31fc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
31fd0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
31fe0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
31ff0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
32000 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
32010 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c  set+8]);.    sql
32020 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32030 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
32040 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
32050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32060 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20 72  "On page %d at r
32070 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69  ight child: ", i
32080 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  Page);.#ifndef S
32090 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
320a0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
320b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
320c0 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d  .      checkPtrm
320d0 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ap(pCheck, pgno,
320e0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69   PTRMAP_BTREE, i
320f0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Page, 0);.    }.
32100 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b  #endif.    check
32110 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c  TreePage(pCheck,
32120 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43   pgno, pPage, zC
32130 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20  ontext);.  }. . 
32140 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
32150 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20  mplete coverage 
32160 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f  of the page.  */
32170 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
32180 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
32190 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
321a0 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65  ;.  hit = sqlite
321b0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 75 73 61  3MallocZero( usa
321c0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
321d0 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73   hit ){.    mems
321e0 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
321f0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
32200 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
32210 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
32220 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
32230 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
32240 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
32250 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
32260 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
32270 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
32280 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
32290 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
322a0 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 63 65     int size = ce
322b0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
322c0 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
322d0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
322e0 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
322f0 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
32300 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
32310 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32320 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
32330 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
32340 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
32350 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
32360 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
32370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32380 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65     for(j=pc+size
32390 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20  -1; j>=pc; j--) 
323a0 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
323b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
323c0 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74  cnt=0, i=get2byt
323d0 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
323e0 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65   i>0 && i<usable
323f0 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30  Size && cnt<1000
32400 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63  0; .           c
32410 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  nt++){.      int
32420 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
32430 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20  (&data[i+2]);.  
32440 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
32450 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e   if( (i+size-1)>
32460 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69  =usableSize || i
32470 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
32480 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32490 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20  eck, 0,  .      
324a0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
324b0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
324c0 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
324d0 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
324e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
324f0 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d     for(j=i+size-
32500 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69  1; j>=i; j--) hi
32510 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
32520 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79        i = get2by
32530 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  te(&data[i]);.  
32540 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e    }.    for(i=cn
32550 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  t=0; i<usableSiz
32560 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
32570 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a  f( hit[i]==0 ){.
32580 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
32590 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
325a0 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  it[i]>1 ){.     
325b0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
325c0 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20  g(pCheck, 0,.   
325d0 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65         "Multiple
325e0 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25   uses for byte %
325f0 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69  d of page %d", i
32600 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
32610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
32620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
32630 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20  nt!=data[hdr+7] 
32640 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32650 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32660 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46  0, .          "F
32670 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
32680 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72  is %d byte repor
32690 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67  ted as %d on pag
326a0 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
326b0 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37   cnt, data[hdr+7
326c0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d  ], iPage);.    }
326d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
326e0 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c  ree(hit);..  rel
326f0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
32700 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b  .  return depth+
32710 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
32720 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
32730 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
32740 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32750 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
32760 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
32770 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d  utine does a com
32780 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74  plete check of t
32790 68 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66  he given BTree f
327a0 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73  ile.  aRoot[] is
327b0 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
327c0 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65  pages numbers we
327d0 72 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d  re each page num
327e0 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20  ber is the root 
327f0 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62  page of.** a tab
32800 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68  le.  nRoot is th
32810 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
32820 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a  ies in aRoot..**
32830 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
32840 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68  g checks out, th
32850 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
32860 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d  ns NULL.  If som
32870 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69  ething is.** ami
32880 73 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ss, an error mes
32890 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
328a0 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
328b0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
328c0 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e  ().** and a poin
328d0 74 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f  ter to that erro
328e0 72 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74  r message is ret
328f0 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c  urned.  The call
32900 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
32910 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
32920 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65  or freeing the e
32930 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
32940 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f  n it is done..*/
32950 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74  .char *sqlite3Bt
32960 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
32970 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  k(.  Btree *p,  
32980 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
32990 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f  to be checked */
329a0 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20  .  int *aRoot,  
329b0 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20   /* An array of 
329c0 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65  root pages numbe
329d0 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61  rs for individua
329e0 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74  l trees */.  int
329f0 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75   nRoot,    /* Nu
32a00 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
32a10 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20  in aRoot[] */.  
32a20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a  int mxErr,    /*
32a30 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20   Stop reporting 
32a40 65 72 72 6f 72 73 20 61 66 74 65 72 20 74 68 69  errors after thi
32a50 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  s many */.  int 
32a60 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69  *pnErr    /* Wri
32a70 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  te number of err
32a80 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73  ors seen to this
32a90 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a   variable */.){.
32aa0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
32ab0 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79  Ref;.  Integrity
32ac0 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53  Ck sCheck;.  BtS
32ad0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32ae0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
32af0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
32b00 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
32b10 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
32b20 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
32b30 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
32b40 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ry(p)!=SQLITE_OK
32b50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
32b60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
32b70 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
32b80 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74  StrDup("Unable t
32b90 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
32ba0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
32bb0 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73  abase");.  }.  s
32bc0 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b  Check.pBt = pBt;
32bd0 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72  .  sCheck.pPager
32be0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
32bf0 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
32c00 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
32c10 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50  ecount(sCheck.pP
32c20 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e  ager);.  sCheck.
32c30 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20  mxErr = mxErr;. 
32c40 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30   sCheck.nErr = 0
32c50 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a  ;.  *pnErr = 0;.
32c60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32c70 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
32c80 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
32c90 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68 65 63  !=0 ){.    sChec
32ca0 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e  k.nPage = pBt->n
32cb0 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  Trunc;.  }.#endi
32cc0 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  f.  if( sCheck.n
32cd0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75  Page==0 ){.    u
32ce0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
32cf0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
32d00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
32d10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
32d20 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e  .  }.  sCheck.an
32d30 52 65 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ref = sqlite3_ma
32d40 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e 6e 50  lloc( (sCheck.nP
32d50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43  age+1)*sizeof(sC
32d60 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29  heck.anRef[0]) )
32d70 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e  ;.  if( !sCheck.
32d80 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c  anRef ){.    unl
32d90 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
32da0 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72  (pBt);.    *pnEr
32db0 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  r = 1;.    sqlit
32dc0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
32dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
32de0 74 65 33 4d 50 72 69 6e 74 66 28 70 2d 3e 70 53  te3MPrintf(p->pS
32df0 71 6c 69 74 65 2c 20 22 55 6e 61 62 6c 65 20 74  qlite, "Unable t
32e00 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74 65  o malloc %d byte
32e10 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73 43  s", .        (sC
32e20 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
32e30 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
32e40 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f  f[0]));.  }.  fo
32e50 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b  r(i=0; i<=sCheck
32e60 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43  .nPage; i++){ sC
32e70 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
32e80 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49  0; }.  i = PENDI
32e90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
32ea0 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65  );.  if( i<=sChe
32eb0 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  ck.nPage ){.    
32ec0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
32ed0 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63  = 1;.  }.  sChec
32ee0 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  k.zErrMsg = 0;..
32ef0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69    /* Check the i
32f00 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
32f10 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20  freelist.  */.  
32f20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63  checkList(&sChec
32f30 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28 26  k, 1, get4byte(&
32f40 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
32f50 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20  ta[32]),.       
32f60 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
32f70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
32f80 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72  a[36]), "Main fr
32f90 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f  eelist: ");..  /
32fa0 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20  * Check all the 
32fb0 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
32fc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20  or(i=0; i<nRoot 
32fd0 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
32fe0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
32ff0 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Root[i]==0 ) con
33000 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
33010 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33020 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
33030 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
33040 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20   aRoot[i]>1 ){. 
33050 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
33060 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
33070 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  i], PTRMAP_ROOTP
33080 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AGE, 0, 0);.    
33090 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
330a0 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65  ckTreePage(&sChe
330b0 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c  ck, aRoot[i], 0,
330c0 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72   "List of tree r
330d0 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20  oots: ");.  }.. 
330e0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76   /* Make sure ev
330f0 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
33100 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63  file is referenc
33110 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ed.  */.  for(i=
33120 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  1; i<=sCheck.nPa
33130 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45  ge && sCheck.mxE
33140 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66  rr; i++){.#ifdef
33150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33160 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
33170 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
33180 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  =0 ){.      chec
33190 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
331a0 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
331b0 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
331c0 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  i);.    }.#else.
331d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
331e0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
331f0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b  auto-vacuum, mak
33200 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73  e sure no tables
33210 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
33220 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f  references to po
33230 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
33240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33250 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
33260 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50  =0 && .       (P
33270 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
33280 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d  , i)!=i || !pBt-
33290 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a  >autoVacuum) ){.
332a0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
332b0 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
332c0 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
332d0 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
332e0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65    }.    if( sChe
332f0 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26  ck.anRef[i]!=0 &
33300 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
33310 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
33320 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f  ==i && pBt->auto
33330 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20  Vacuum) ){.     
33340 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
33350 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69  &sCheck, 0, "Poi
33360 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25 64  nter map page %d
33370 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c   is referenced",
33380 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   i);.    }.#endi
33390 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  f.  }..  /* Make
333a0 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79   sure this analy
333b0 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76  sis did not leav
333c0 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61  e any unref() pa
333d0 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63  ges.  */.  unloc
333e0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
333f0 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20  Bt);.  if( nRef 
33400 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  != sqlite3PagerR
33410 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
33420 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63  ger) ){.    chec
33430 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
33440 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f  ck, 0, .      "O
33450 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
33460 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20  count goes from 
33470 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20  %d to %d during 
33480 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a  this analysis",.
33490 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69        nRef, sqli
334a0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
334b0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20  (pBt->pPager).  
334c0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43    );.  }..  /* C
334d0 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70  lean  up and rep
334e0 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  ort errors..  */
334f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
33500 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  eave(p);.  sqlit
33510 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61  e3_free(sCheck.a
33520 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20  nRef);.  *pnErr 
33530 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20  = sCheck.nErr;. 
33540 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a   return sCheck.z
33550 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66  ErrMsg;.}.#endif
33560 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
33570 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
33580 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
33590 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
335a0 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  me of the underl
335b0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
335c0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
335d0 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
335e0 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65  etFilename(Btree
335f0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
33600 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
33610 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
33620 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33630 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
33640 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
33650 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
33660 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
33670 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
33680 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
33690 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
336a0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
336b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
336c0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
336d0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
336e0 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  Dirname(Btree *p
336f0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
33700 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
33710 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
33720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
33730 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
33740 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
33750 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d  3PagerDirname(p-
33760 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
33770 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33780 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  he pathname of t
33790 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
337a0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
337b0 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a  e. The return.**
337c0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72   value of this r
337d0 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61  outine is the sa
337e0 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  me regardless of
337f0 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75   whether the jou
33800 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73  rnal file.** has
33810 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72   been created or
33820 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63   not..*/.const c
33830 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
33840 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
33850 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
33860 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
33870 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
33880 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
33890 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
338a0 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
338b0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  n sqlite3PagerJo
338c0 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74  urnalname(p->pBt
338d0 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69  ->pPager);.}..#i
338e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
338f0 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43  T_VACUUM./*.** C
33900 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  opy the complete
33910 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46   content of pBtF
33920 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20  rom into pBtTo. 
33930 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   A transaction.*
33940 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  * must be active
33950 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e   for both files.
33960 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
33970 6f 66 20 66 69 6c 65 20 70 42 74 46 72 6f 6d 20  of file pBtFrom 
33980 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20 62  may be reduced b
33990 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
339a0 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  ..** If anything
339b0 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65   goes wrong, the
339c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
339d0 70 42 74 46 72 6f 6d 20 69 73 20 72 6f 6c 6c 65  pBtFrom is rolle
339e0 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
339f0 63 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46  c int btreeCopyF
33a00 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20  ile(Btree *pTo, 
33a10 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Btree *pFrom){. 
33a20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33a30 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c 20 6e  _OK;.  Pgno i, n
33a40 50 61 67 65 2c 20 6e 54 6f 50 61 67 65 2c 20 69  Page, nToPage, i
33a50 53 6b 69 70 3b 0a 0a 20 20 42 74 53 68 61 72 65  Skip;..  BtShare
33a60 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e  d *pBtTo = pTo->
33a70 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pBt;.  BtShared 
33a80 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  *pBtFrom = pFrom
33a90 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 54  ->pBt;..  if( pT
33aa0 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  o->inTrans!=TRAN
33ab0 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d  S_WRITE || pFrom
33ac0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
33ad0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
33ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
33af0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74  R;.  }.  if( pBt
33b00 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 20 72 65  To->pCursor ) re
33b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
33b20 3b 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20 73 71  ;.  nToPage = sq
33b30 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
33b40 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  unt(pBtTo->pPage
33b50 72 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71  r);.  nPage = sq
33b60 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
33b70 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61  unt(pBtFrom->pPa
33b80 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20  ger);.  iSkip = 
33b90 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33ba0 45 28 70 42 74 54 6f 29 3b 0a 20 20 66 6f 72 28  E(pBtTo);.  for(
33bb0 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=1; rc==SQLITE_
33bc0 4f 4b 20 26 26 20 69 3c 3d 6e 50 61 67 65 3b 20  OK && i<=nPage; 
33bd0 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65  i++){.    DbPage
33be0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69   *pDbPage;.    i
33bf0 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f  f( i==iSkip ) co
33c00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d  ntinue;.    rc =
33c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33c20 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
33c30 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , i, &pDbPage);.
33c40 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
33c50 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ak;.    rc = sql
33c60 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69  ite3PagerOverwri
33c70 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  te(pBtTo->pPager
33c80 2c 20 69 2c 20 73 71 6c 69 74 65 33 50 61 67 65  , i, sqlite3Page
33c90 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
33ca0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
33cb0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
33cc0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
33cd0 20 74 68 65 20 66 69 6c 65 20 69 73 20 73 68 72   the file is shr
33ce0 69 6e 6b 69 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20  inking, journal 
33cf0 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 61  the pages that a
33d00 72 65 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  re being truncat
33d10 65 64 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  ed.  ** so that 
33d20 74 68 65 79 20 63 61 6e 20 62 65 20 72 6f 6c 6c  they can be roll
33d30 65 64 20 62 61 63 6b 20 69 66 20 74 68 65 20 63  ed back if the c
33d40 6f 6d 6d 69 74 20 66 61 69 6c 73 2e 0a 20 20 2a  ommit fails..  *
33d50 2f 0a 20 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b  /.  for(i=nPage+
33d60 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
33d70 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20   && i<=nToPage; 
33d80 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65  i++){.    DbPage
33d90 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69   *pDbPage;.    i
33da0 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f  f( i==iSkip ) co
33db0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d  ntinue;.    rc =
33dc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33dd0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
33de0 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  i, &pDbPage);.  
33df0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
33e00 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33e10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
33e20 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Page);.    sqlit
33e30 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
33e40 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 2f  (pDbPage);.    /
33e50 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d  * Yeah.  It seem
33e60 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20  s wierd to call 
33e70 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67 68  DontWrite() righ
33e80 74 20 61 66 74 65 72 20 57 72 69 74 65 28 29 2e  t after Write().
33e90 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74 68 61    But.    ** tha
33ea0 74 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  t is because the
33eb0 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20   names of those 
33ec0 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f  procedures do no
33ed0 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20 2a  t exactly .    *
33ee0 2a 20 72 65 70 72 65 73 65 6e 74 20 77 68 61 74  * represent what
33ef0 20 74 68 65 79 20 64 6f 2e 20 20 57 72 69 74 65   they do.  Write
33f00 28 29 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20  () really means 
33f10 22 70 75 74 20 74 68 69 73 20 70 61 67 65 20 69  "put this page i
33f20 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6c  n the.    ** rol
33f30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
33f40 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72  d mark it as dir
33f50 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ty so that it wi
33f60 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ll be written.  
33f70 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
33f80 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e  base file later.
33f90 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75  "  DontWrite() u
33fa0 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64  ndoes the second
33fb0 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20   part of.    ** 
33fc0 74 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74  that and prevent
33fd0 73 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  s the page from 
33fe0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  being written to
33ff0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
34000 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
34010 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  is still on the 
34020 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
34030 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74  , though.  And t
34040 68 61 74 20 69 73 20 74 68 65 20 77 68 6f 6c 65  hat is the whole
34050 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6f 66  .    ** point of
34060 20 74 68 69 73 20 6c 6f 6f 70 3a 20 74 6f 20 70   this loop: to p
34070 75 74 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  ut pages on the 
34080 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
34090 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
340a0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
340b0 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ge);.  }.  if( !
340c0 72 63 20 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50  rc && nPage<nToP
340d0 61 67 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  age ){.    rc = 
340e0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
340f0 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  cate(pBtTo->pPag
34100 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  er, nPage);.  }.
34110 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
34120 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
34130 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a  lback(pTo);.  }.
34140 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
34150 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
34160 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20  eCopyFile(Btree 
34170 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72  *pTo, Btree *pFr
34180 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  om){.  int rc;. 
34190 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
341a0 65 72 28 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74  er(pTo);.  sqlit
341b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 46 72  e3BtreeEnter(pFr
341c0 6f 6d 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  om);.  rc = btre
341d0 65 43 6f 70 79 46 69 6c 65 28 70 54 6f 2c 20 70  eCopyFile(pTo, p
341e0 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  From);.  sqlite3
341f0 42 74 72 65 65 4c 65 61 76 65 28 70 46 72 6f 6d  BtreeLeave(pFrom
34200 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
34210 65 4c 65 61 76 65 28 70 54 6f 29 3b 0a 20 20 72  eLeave(pTo);.  r
34220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
34230 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
34240 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a  IT_VACUUM */../*
34250 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
34260 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63  ero if a transac
34270 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
34280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
34290 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72  reeIsInTrans(Btr
342a0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
342b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
342c0 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
342d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
342e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
342f0 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e  eld(p->pSqlite->
34300 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
34310 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54  rn (p && (p->inT
34320 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
34330 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  E));.}../*.** Re
34340 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
34350 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
34360 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
34370 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
34380 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28  e3BtreeIsInStmt(
34390 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
343a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
343b0 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
343c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
343d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
343e0 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74  x_held(p->pSqlit
343f0 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  e->mutex) );.  r
34400 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26  eturn (p->pBt &&
34410 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29   p->pBt->inStmt)
34420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
34430 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20  n non-zero if a 
34440 72 65 61 64 20 28 6f 72 20 77 72 69 74 65 29 20  read (or write) 
34450 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
34460 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
34470 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65  lite3BtreeIsInRe
34480 61 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  adTrans(Btree *p
34490 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
344a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
344b0 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
344c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
344d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
344e0 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
344f0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ) );.  return (p
34500 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21   && (p->inTrans!
34510 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d  =TRANS_NONE));.}
34520 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
34530 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
34540 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f  pointer to a blo
34550 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
34560 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  ciated with.** a
34570 20 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62   single shared-b
34580 74 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79  tree. The memory
34590 20 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65   is used by clie
345a0 6e 74 20 63 6f 64 65 20 66 6f 72 20 69 74 27 73  nt code for it's
345b0 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73   own.** purposes
345c0 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74   (for example, t
345d0 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c  o store a high-l
345e0 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f  evel schema asso
345f0 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
34600 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
34610 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c 61 79  ). The btree lay
34620 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72  er manages refer
34630 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73  ence counting is
34640 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sues..**.** The 
34650 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
34660 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73  is called on a s
34670 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79  hared-btree, nBy
34680 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  tes bytes of mem
34690 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63  ory.** are alloc
346a0 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e  ated, zeroed, an
346b0 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  d returned to th
346c0 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61  e caller. For ea
346d0 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a  ch subsequent .*
346e0 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65  * call the nByte
346f0 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  s parameter is i
34700 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69  gnored and a poi
34710 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65  nter to the same
34720 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f   blob.** of memo
34730 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  ry returned. .**
34740 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20  .** Just before 
34750 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
34760 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20   is closed, the 
34770 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20  function passed 
34780 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65  as the .** xFree
34790 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74   argument when t
347a0 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
347b0 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73  tion was made is
347c0 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20   invoked on the 
347d0 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f  .** blob of allo
347e0 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68  cated memory. Th
347f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
34800 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69  ld not call sqli
34810 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e  te3_free().** on
34820 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65   the memory, the
34830 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65   btree layer doe
34840 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20  s that..*/.void 
34850 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68  *sqlite3BtreeSch
34860 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ema(Btree *p, in
34870 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a  t nBytes, void(*
34880 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b  xFree)(void *)){
34890 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
348a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
348b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
348c0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
348d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
348e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
348f0 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e  eld(p->pSqlite->
34900 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
34910 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b  !pBt->pSchema ){
34920 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65 6d  .    pBt->pSchem
34930 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  a = sqlite3Mallo
34940 63 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b 0a 20  cZero(nBytes);. 
34950 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
34960 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d  ema = xFree;.  }
34970 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70  .  return pBt->p
34980 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Schema;.}../*.**
34990 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
349a0 61 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20  another user of 
349b0 74 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20  the same shared 
349c0 62 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67  btree as the arg
349d0 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20  ument.** handle 
349e0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
349f0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73  ve lock on the s
34a00 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
34a10 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
34a20 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63  e3BtreeSchemaLoc
34a30 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ked(Btree *p){. 
34a40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34a50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
34a60 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
34a70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
34a80 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53  mutex_held(p->pS
34a90 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b  qlite->mutex) );
34aa0 0a 20 20 72 65 74 75 72 6e 20 28 71 75 65 72 79  .  return (query
34ab0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
34ac0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
34ad0 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  OCK)!=SQLITE_OK)
34ae0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
34af0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
34b00 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74  _CACHE./*.** Obt
34b10 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ain a lock on th
34b20 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
34b30 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e  ot page is iTab.
34b40 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73    The.** lock is
34b50 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
34b60 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20   isWritelock is 
34b70 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c  true or a read l
34b80 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  ock.** if it is 
34b90 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
34ba0 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
34bb0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
34bc0 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69  t iTab, u8 isWri
34bd0 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  teLock){.  int r
34be0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34bf0 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28   u8 lockType = (
34c00 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54  isWriteLock?WRIT
34c10 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b  E_LOCK:READ_LOCK
34c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
34c30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
34c40 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
34c50 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
34c60 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pe);.  if( rc==S
34c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34c80 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
34c90 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
34ca0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
34cb0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
34cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
34cd0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
34ce0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
34cf0 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  OB./*.** Argumen
34d00 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61  t pCsr must be a
34d10 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66   cursor opened f
34d20 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e  or writing on an
34d30 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c   .** INTKEY tabl
34d40 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
34d50 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
34d60 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a  table entry. .**
34d70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
34d80 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61  odifies the data
34d90 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
34da0 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a  of that entry..*
34db0 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  * Only the data 
34dc0 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79  content may only
34dd0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74   be modified, it
34de0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
34df0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
34e00 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
34e10 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  data stored..*/.
34e20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
34e30 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72  PutData(BtCursor
34e40 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73   *pCsr, u32 offs
34e50 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
34e60 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28  d *z){.  assert(
34e70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
34e80 65 6c 64 28 70 43 73 72 2d 3e 70 42 74 72 65 65  eld(pCsr->pBtree
34e90 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
34ea0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34eb0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
34ec0 73 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  sr->pBtree->pSql
34ed0 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
34ee0 20 61 73 73 65 72 74 28 70 43 73 72 2d 3e 69 73   assert(pCsr->is
34ef0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b  IncrblobHandle);
34f00 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74  .  if( pCsr->eSt
34f10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate==CURSOR_REQU
34f20 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 72  IRESEEK ){.    r
34f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
34f40 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  RT;.  }..  /* Ch
34f50 65 63 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64  eck some precond
34f60 69 74 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20  itions: .  **   
34f70 28 61 29 20 74 68 65 20 63 75 72 73 6f 72 20 69  (a) the cursor i
34f80 73 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  s open for writi
34f90 6e 67 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74  ng,.  **   (b) t
34fa0 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d  here is no read-
34fb0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
34fc0 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  e being modified
34fd0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
34fe0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
34ff0 73 20 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77  s at a valid row
35000 20 6f 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   of an intKey ta
35010 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
35020 21 70 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCsr->wrFlag ){
35030 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
35040 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
35050 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 73 72  .  assert( !pCsr
35060 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 72  ->pBtree->pBt->r
35070 65 61 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20  eadOnly .       
35080 20 20 20 26 26 20 70 43 73 72 2d 3e 70 42 74 72     && pCsr->pBtr
35090 65 65 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ee->pBt->inTrans
350a0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
350b0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65  ITE );.  if( che
350c0 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72  ckReadLocks(pCsr
350d0 2d 3e 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e  ->pBtree, pCsr->
350e0 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 29 20  pgnoRoot, pCsr) 
350f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
35100 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20  LITE_LOCKED; /* 
35110 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
35120 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
35130 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a  ead lock */.  }.
35140 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61    if( pCsr->eSta
35150 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
35160 49 44 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61  ID || !pCsr->pPa
35170 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
35180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35190 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
351a0 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
351b0 61 64 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c  ad(pCsr, offset,
351c0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
351d0 63 68 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b  char *)z, 0, 1);
351e0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61  .}../* .** Set a
351f0 20 66 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75   flag on this cu
35200 72 73 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68  rsor to cache th
35210 65 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70  e locations of p
35220 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a  ages from the .*
35230 2a 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  * overflow list 
35240 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
35250 72 6f 77 2e 20 54 68 69 73 20 69 73 20 75 73 65  row. This is use
35260 64 20 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65  d by cursors ope
35270 6e 65 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65  ned.** for incre
35280 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f  mental blob IO o
35290 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nly..**.** This 
352a0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20  function sets a 
352b0 66 6c 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61  flag only. The a
352c0 63 74 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74  ctual page locat
352d0 69 6f 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74  ion cache.** (st
352e0 6f 72 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72  ored in BtCursor
352f0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73  .aOverflow[]) is
35300 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75   allocated and u
35310 73 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a  sed by function.
35320 2a 2a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  ** accessPayload
35330 28 29 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66  () (the worker f
35340 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69  unction for sqli
35350 74 65 33 42 74 72 65 65 44 61 74 61 28 29 20 61  te3BtreeData() a
35360 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  nd.** sqlite3Btr
35370 65 65 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f  eePutData())..*/
35380 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
35390 65 65 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28  eeCacheOverflow(
353a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
353b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
353c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
353d0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2d  ur->pBtree->pBt-
353e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
353f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
35400 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
35410 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d  tree->pSqlite->m
35420 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
35430 74 28 21 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  t(!pCur->isIncrb
35440 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61 73  lobHandle);.  as
35450 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
35460 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e  rflow);.  pCur->
35470 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
35480 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a      = 1;.}.#endif.