/ Hex Artifact Content
Login

Artifact 6d3db6416c71f678a4dd4719ce6d754ad5927c46:


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 33 37 37 20 32 30 30 37 2f 30  c,v 1.377 2007/0
0190: 35 2f 30 35 20 31 38 3a 33 39 3a 32 35 20 64 72  5/05 18:39:25 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 53  EADER;.../*.** S
0330: 65 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76  et this global v
0340: 61 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20  ariable to 1 to 
0350: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75  enable tracing u
0360: 73 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a  sing the TRACE.*
0370: 2a 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20  * macro..*/.#if 
0380: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0390: 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72  sqlite3_btree_tr
03a0: 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20  ace=0;  /* True 
03b0: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
03c0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g */.#endif../*.
03d0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
03e0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
03f0: 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
0400: 63 6b 73 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c  cks(Btree*,Pgno,
0410: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 0a 23 69  BtCursor*);...#i
0420: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
0440: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63  /*.  ** The func
0450: 74 69 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65  tions queryTable
0460: 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c  Lock(), lockTabl
0470: 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c  e() and unlockAl
0480: 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d  lTables().  ** m
0490: 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65  anipulate entrie
04a0: 73 20 69 6e 20 74 68 65 20 42 74 53 68 61 72 65  s in the BtShare
04b0: 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c  d.pLock linked l
04c0: 69 73 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ist used to stor
04d0: 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61  e.  ** shared-ca
04e0: 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20  che table level 
04f0: 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69  locks. If the li
0500: 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65  brary is compile
0510: 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
0520: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
0530: 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74  ture disabled, t
0540: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  hen there is onl
0550: 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a  y ever one user.
0560: 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53    ** of each BtS
0570: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
0580: 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b  and so this lock
0590: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
05a0: 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64  sary. .  ** So d
05b0: 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72  efine the lock r
05c0: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73  elated functions
05d0: 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f   as no-ops..  */
05e0: 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65 72 79  .  #define query
05f0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
0600: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
0610: 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61  fine lockTable(a
0620: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
0630: 20 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b    #define unlock
0640: 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a 23 65 6c  AllTables(a).#el
0650: 73 65 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  se../*.** Query 
0660: 74 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20  to see if btree 
0670: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
0680: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
0690: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
06a0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
06b0: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
06c0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
06d0: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
06e0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
06f0: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
0700: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
0710: 6c 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29  ling lockTable()
0720: 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ), or.** SQLITE_
0730: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
0740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
0750: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  ryTableLock(Btre
0760: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
0770: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
0780: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
0790: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
07a0: 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69  pIter;..  /* Thi
07b0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
07c0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
07d0: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
07e0: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
07f0: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
0800: 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72  dOnly()->useShar
0810: 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  edData ){.    re
0820: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0830: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28    }..  /* This (
0840: 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54  along with lockT
0850: 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65  able()) is where
0860: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0870: 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a  tted flag is.  *
0880: 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66  * dealt with. If
0890: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71   the caller is q
08a0: 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65  uerying for a re
08b0: 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ad-lock and the 
08c0: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74  flag is.  ** set
08d0: 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74  , it is uncondit
08e0: 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20  ionally granted 
08f0: 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  - even if there 
0900: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
0910: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
0920: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
0930: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
0940: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0950: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
0960: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
0970: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
0980: 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c  unction lockTabl
0990: 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c  e(), if a read-l
09a0: 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20  ock is demanded 
09b0: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65  and the .  ** Re
09c0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
09d0: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e  ag is set, no en
09e0: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
09f0: 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a  the locks list .
0a00: 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70    ** (BtShared.p
0a10: 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Lock)..  **.  **
0a20: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49   To summarize: I
0a30: 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  f the ReadUncomm
0a40: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0a50: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72  t, then read cur
0a60: 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  sors do.  ** not
0a70: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
0a80: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
0a90: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63  The locking proc
0aa0: 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a  edure for a .  *
0ab0: 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64  * write-cursor d
0ac0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a  oes not change..
0ad0: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
0ae0: 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a  !p->pSqlite || .
0af0: 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69      0==(p->pSqli
0b00: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
0b10: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
0b20: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
0b30: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
0b40: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
0b50: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
0b60: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
0b70: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
0b80: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
0b90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
0ba0: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
0bb0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
0bc0: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
0bd0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
0be0: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
0bf0: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
0c00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0c10: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
0c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
0c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
0c50: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
0c60: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0c70: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
0c80: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
0c90: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
0ca0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
0cb0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
0cc0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
0cd0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
0ce0: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
0cf0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
0d00: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
0d10: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
0d20: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
0d30: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
0d40: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
0d50: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
0d60: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
0d70: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
0d80: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
0d90: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
0da0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
0db0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
0dc0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
0dd0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  ;..  /* This is 
0de0: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
0df0: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
0e00: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
0e10: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54 68  if( 0==sqlite3Th
0e20: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
0e30: 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ()->useSharedDat
0e40: 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
0e50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
0e60: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
0e70: 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c  _OK==queryTableL
0e80: 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65  ock(p, iTable, e
0e90: 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  Lock) );..  /* I
0ea0: 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  f the read-uncom
0eb0: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
0ec0: 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  et and a read-lo
0ed0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
0ee0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72  .  ** return ear
0ef0: 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e  ly without addin
0f00: 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  g an entry to th
0f10: 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b  e BtShared.pLock
0f20: 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20   list. See.  ** 
0f30: 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74  comment in funct
0f40: 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  ion queryTableLo
0f50: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e  ck() for more in
0f60: 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a  fo on handling .
0f70: 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63    ** the ReadUnc
0f80: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20  ommitted flag.. 
0f90: 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
0fa0: 70 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20 0a  p->pSqlite) && .
0fb0: 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d      (p->pSqlite-
0fc0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
0fd0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26  adUncommitted) &
0fe0: 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52  & .    (eLock==R
0ff0: 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20  EAD_LOCK) &&.   
1000: 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f   iTable!=MASTER_
1010: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65  ROOT.  ){.    re
1020: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1030: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
1040: 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  search the list 
1050: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
1060: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62  lock on this tab
1070: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  le. */.  for(pIt
1080: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1090: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
10a0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
10b0: 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  f( pIter->iTable
10c0: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65  ==iTable && pIte
10d0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  r->pBtree==p ){.
10e0: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49        pLock = pI
10f0: 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ter;.      break
1100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1110: 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73  * If the above s
1120: 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69  earch did not fi
1130: 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75  nd a BtLock stru
1140: 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42  ct associating B
1150: 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68  tree p.  ** with
1160: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61   table iTable, a
1170: 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20  llocate one and 
1180: 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
1190: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   list..  */.  if
11a0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
11b0: 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20  pLock = (BtLock 
11c0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  *)sqliteMalloc(s
11d0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
11e0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
11f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1210: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
1220: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
1230: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
1240: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
1250: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
1260: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
1270: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
1280: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
1290: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
12a0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
12b0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
12c0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
12d0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
12e0: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
12f0: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
1300: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
1310: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
1320: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
1330: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
1340: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
1350: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
1360: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
1370: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
1380: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
1390: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
13a0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
13b0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
13c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
13e0: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
13f0: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
1400: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
1410: 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28  o the lockTable(
1420: 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20  ).** procedure) 
1430: 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61  held by Btree ha
1440: 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69  ndle p..*/.stati
1450: 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c  c void unlockAll
1460: 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29  Tables(Btree *p)
1470: 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  {.  BtLock **ppI
1480: 74 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70  ter = &p->pBt->p
1490: 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Lock;..  /* If t
14a0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
14b0: 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74  extension is not
14c0: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20   enabled, there 
14d0: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a  should be no.  *
14e0: 2a 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 42  * locks in the B
14f0: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69  tShared.pLock li
1500: 73 74 2c 20 6d 61 6b 69 6e 67 20 74 68 69 73 20  st, making this 
1510: 70 72 6f 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f  procedure a no-o
1520: 70 2e 20 41 73 73 65 72 74 0a 20 20 2a 2a 20 74  p. Assert.  ** t
1530: 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20  hat this is the 
1540: 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  case..  */.  ass
1550: 65 72 74 28 20 73 71 6c 69 74 65 33 54 68 72 65  ert( sqlite3Thre
1560: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
1570: 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
1580: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1590: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
15a0: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
15b0: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
15c0: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  r;.    if( pLock
15d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
15e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
15f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
1600: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
1610: 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ock);.    }else{
1620: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
1630: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
1640: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1650: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1660: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1670: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
1680: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
1690: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
16a0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
16b0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
16c0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
16d0: 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  B./*.** Invalida
16e0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
16f0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1700: 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c  for cursor pCur,
1710: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
1720: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
1730: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1740: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1750: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
1760: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
1770: 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1780: 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w = 0;.}../*.** 
1790: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
17a0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
17b0: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
17c0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
17d0: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
17e0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
17f0: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
1800: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
1810: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
1820: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1830: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1840: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
1850: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1860: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
1870: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1880: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  p);.  }.}.#else.
1890: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
18a0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
18b0: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
18c0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
18d0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e  flowCache(x).#en
18e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  dif../*.** Save 
18f0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
1900: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
1910: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
1920: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
1930: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
1940: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
1950: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
1960: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1970: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1980: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
1990: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
19a0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
19b0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
19c0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
19d0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
19e0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
19f0: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1a00: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1a10: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
1a20: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1a30: 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   is an intKey ta
1a40: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62  ble, then the ab
1a50: 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  ove call to Btre
1a60: 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20  eKeySize().  ** 
1a70: 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67  stores the integ
1a80: 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e  er key in pCur->
1a90: 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61  nKey. In this ca
1aa0: 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  se this value is
1ab0: 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69  .  ** all that i
1ac0: 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  s required. Othe
1ad0: 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
1ae0: 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e  s not open on an
1af0: 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62   intKey.  ** tab
1b00: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
1b10: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
1b20: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
1b30: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
1b40: 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f  .  ** data..  */
1b50: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b60: 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d  E_OK && 0==pCur-
1b70: 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b  >pPage->intKey){
1b80: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
1b90: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70  = sqliteMalloc(p
1ba0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  Cur->nKey);.    
1bb0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
1bc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1bd0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1be0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
1bf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c10: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
1c20: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
1c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1c40: 6c 69 74 65 46 72 65 65 28 70 4b 65 79 29 3b 0a  liteFree(pKey);.
1c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1c60: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1c70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1c80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1c90: 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  !pCur->pPage->in
1ca0: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
1cb0: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
1cc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cd0: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ce0: 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
1cf0: 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30   pCur->pPage = 0
1d00: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1d10: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
1d20: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
1d30: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1d40: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
1d50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d60: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
1d70: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
1d80: 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45  ursors except pE
1d90: 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68  xcept open on th
1da0: 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68  e table .** with
1db0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
1dc0: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
1dd0: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
1de0: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
1df0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
1e00: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
1e10: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
1e20: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
1e30: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
1e40: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
1e50: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
1e60: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
1e70: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
1e80: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1e90: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
1ea0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1eb0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1ec0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
1ed0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
1ee0: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
1ef0: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
1f00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f10: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
1f20: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
1f30: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
1f40: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1f50: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1f60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1f80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f90: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
1fa0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
1fb0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
1fc0: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43  atic void clearC
1fd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
1fe0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ff0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
2000: 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  ->pKey);.  pCur-
2010: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75  >pKey = 0;.  pCu
2020: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2030: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  OR_INVALID;.}../
2040: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
2050: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
2060: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
2070: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
2080: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
2090: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
20a0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
20b0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
20c0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
20d0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
20e0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
20f0: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
2100: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
2110: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
2120: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
2130: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
2140: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2150: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
2160: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
2170: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2180: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
2190: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
21a0: 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65 6b  rgument - doSeek
21b0: 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65   - is false, the
21c0: 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a 2a  n instead of .**
21d0: 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 63   returning the c
21e0: 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73 61  ursor to it's sa
21f0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  ved position, an
2200: 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  y saved position
2210: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   is deleted.** a
2220: 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
2230: 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53 4f  ate set to CURSO
2240: 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 69 6e  R_INVALID..*/.in
2250: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  t sqlite3BtreeRe
2260: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2270: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
2280: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2290: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
22a0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22b0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
22c0: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
22d0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
22e0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49  .  if( pCur->isI
22f0: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 29 7b  ncrblobHandle ){
2300: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2310: 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
2320: 6e 64 69 66 0a 20 20 70 43 75 72 2d 3e 65 53 74  ndif.  pCur->eSt
2330: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2340: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ALID;.  rc = sql
2350: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
2360: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
2370: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
2380: 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20   &pCur->skip);. 
2390: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23a0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
23b0: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  Free(pCur->pKey)
23c0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
23d0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
23e0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2400: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2410: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
2420: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2430: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
2440: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2450: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
2460: 28 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  (p->eState==CURS
2470: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
2480: 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   \.         sqli
2490: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f  te3BtreeRestoreO
24a0: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
24b0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
24c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
24d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
24f0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
2500: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
2510: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
2520: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
2530: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2540: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
2550: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
2560: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
2570: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
2580: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
2590: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
25a0: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
25b0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
25c0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
25d0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
25e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
25f0: 35 29 2b 31 3b 0a 20 20 69 6e 74 20 69 50 74 72  5)+1;.  int iPtr
2600: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
2610: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
2620: 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 28 69 50  .  int ret = (iP
2630: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
2640: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
2650: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
2660: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2670: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
2680: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
2690: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
26a0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
26b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
26c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26d0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
26e0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
26f0: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
2700: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
2710: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
2720: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
2730: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
2740: 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72  pgno'..** An err
2750: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2760: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
2770: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
2780: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
2790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27a0: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
27b0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
27c0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
27d0: 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50  o parent){.  DbP
27e0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
27f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
2800: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
2810: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
2820: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
2830: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
2840: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
2850: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2860: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
2870: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
2880: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
2890: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
28a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
28b0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
28c0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
28d0: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
28e0: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
28f0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
2900: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
2910: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
2920: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2930: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
2940: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2950: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
2960: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
2970: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2980: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
2990: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
29a0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
29b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
29c0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
29d0: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
29e0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
29f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a10: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
2a20: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70  RMAP_PTROFFSET(p
2a30: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72  Bt, key);.  pPtr
2a40: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
2a50: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2a60: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
2a70: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
2a80: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
2a90: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
2aa0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
2ab0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
2ac0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
2ad0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
2ae0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
2af0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ));.    rc = sql
2b00: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b10: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2b20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b30: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
2b40: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
2b50: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2b60: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
2b70: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
2b80: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
2b90: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
2ba0: 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
2bb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
2bc0: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
2bd0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
2be0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2bf0: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
2c00: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
2c10: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
2c20: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
2c30: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
2c40: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
2c50: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
2c60: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
2c70: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
2c80: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
2c90: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
2ca0: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
2cb0: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
2cc0: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2cd0: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
2ce0: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
2cf0: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
2d00: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
2d10: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
2d20: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2d30: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
2d40: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
2d50: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
2d60: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
2d70: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
2d80: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
2d90: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
2da0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
2db0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
2dc0: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
2dd0: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
2de0: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
2df0: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
2e00: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
2e10: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
2e20: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
2e30: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
2e40: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
2e50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2e60: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
2e70: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
2e80: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
2e90: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
2ea0: 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c  P_PTROFFSET(pBt,
2eb0: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
2ec0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
2ed0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
2ee0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
2ef0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
2f00: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
2f10: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
2f20: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
2f30: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
2f40: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
2f50: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
2f60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2f70: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
2f80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2fa0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2fb0: 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  M */../*.** Give
2fc0: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
2fd0: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
2fe0: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
2ff0: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
3000: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
3010: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
3020: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
3030: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
3040: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
3050: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
3060: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
3070: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
3080: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
3090: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
30a0: 6c 73 2e 0a 2a 2f 0a 75 38 20 2a 73 71 6c 69 74  ls..*/.u8 *sqlit
30b0: 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28  e3BtreeFindCell(
30c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
30d0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
30e0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
30f0: 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28  aData;.  assert(
3100: 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61   iCell>=0 );.  a
3110: 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65 74  ssert( iCell<get
3120: 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
3130: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
3140: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 61 74   );.  return dat
3150: 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  a + get2byte(&da
3160: 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
3170: 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b 0a  fset+2*iCell]);.
3180: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  }../*.** This a 
3190: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
31a0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 42  sion of sqlite3B
31b0: 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20 74  treeFindCell() t
31c0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
31d0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
31e0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
31f0: 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65  cells.  See inse
3200: 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  rt.*/.static u8 
3210: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
3220: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
3230: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
3240: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
3250: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
3260: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3270: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
3280: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
3290: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
32a0: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
32b0: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
32c0: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
32d0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
32e0: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
32f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3300: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
3310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
3320: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
3330: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3340: 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70  3BtreeFindCell(p
3350: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
3360: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
3370: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
3380: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
3390: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
33a0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
33b0: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
33c0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
33d0: 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  n.  sqlite3Btree
33e0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
33f0: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
3400: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
3410: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71   argument and sq
3420: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3430: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
3440: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
3450: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
3460: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
3470: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
3480: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
3490: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
34a0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
34b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
34d0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
34e0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
34f0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3500: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
3510: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
3520: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
3530: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
3540: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cture */.){.  in
3550: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
3560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3570: 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f  bytes in cell co
3580: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a  ntent header */.
3590: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
35a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
35c0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
35d0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
35e0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
35f0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
3600: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
3610: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
3620: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
3630: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
3640: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
3650: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  ;.  if( pPage->h
3660: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 20  asData ){.    n 
3670: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
3680: 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c  pCell[n], &nPayl
3690: 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
36a0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
36b0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44  .  }.  pInfo->nD
36c0: 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  ata = nPayload;.
36d0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
36e0: 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  Key ){.    n += 
36f0: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
3700: 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26 70 49 6e  [n], (u64 *)&pIn
3710: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
3720: 73 65 7b 0a 20 20 20 20 75 33 32 20 78 3b 0a 20  se{.    u32 x;. 
3730: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
3740: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26  t32(&pCell[n], &
3750: 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  x);.    pInfo->n
3760: 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61  Key = x;.    nPa
3770: 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a  yload += x;.  }.
3780: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
3790: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
37a0: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
37b0: 20 6e 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   n;.  if( nPaylo
37c0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
37d0: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
37e0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
37f0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
3800: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
3810: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
3820: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
3830: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
3840: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
3850: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
3860: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
3870: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
3880: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
3890: 79 74 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66  ytes */.    pInf
38a0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79  o->nLocal = nPay
38b0: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
38c0: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
38d0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
38e0: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66  load + n;.    if
38f0: 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20  ( nSize<4 ){.   
3900: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20     nSize = 4;   
3910: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
3920: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
3930: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66  /.    }.    pInf
3940: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65  o->nSize = nSize
3950: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
3960: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
3970: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
3980: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
3990: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
39a0: 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65  ave.    ** to de
39b0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
39c0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
39d0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
39e0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a  pill onto.    **
39f0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
3a00: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
3a10: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
3a20: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
3a30: 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  ed.    ** space 
3a40: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
3a50: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
3a60: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
3a70: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20  cal storage.    
3a80: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
3a90: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
3aa0: 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cal..    **.    
3ab0: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
3ac0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
3ad0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
3ae0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
3af0: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20   any.    ** way 
3b00: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
3b10: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
3b20: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20  ile format..    
3b30: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  */.    int minLo
3b40: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
3b50: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
3b60: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
3b70: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f  */.    int maxLo
3b80: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
3b90: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
3ba0: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
3bb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c  */.    int surpl
3bc0: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
3bd0: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
3be0: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
3bf0: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69  orage */..    mi
3c00: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
3c10: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61  minLocal;.    ma
3c20: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
3c30: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75  maxLocal;.    su
3c40: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
3c50: 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
3c60: 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d  inLocal)%(pPage-
3c70: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
3c80: 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73   - 4);.    if( s
3c90: 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63  urplus <= maxLoc
3ca0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  al ){.      pInf
3cb0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70  o->nLocal = surp
3cc0: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
3cd0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
3ce0: 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  cal = minLocal;.
3cf0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
3d00: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e  >iOverflow = pIn
3d10: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a  fo->nLocal + n;.
3d20: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
3d30: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
3d40: 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 76  low + 4;.  }.}.v
3d50: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3d60: 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d  ParseCell(.  Mem
3d70: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
3d80: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
3d90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
3da0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c   */.  int iCell,
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dc0: 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e   The cell index.
3dd0: 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20    First cell is 
3de0: 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  0 */.  CellInfo 
3df0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
3e00: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
3e10: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
3e20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
3e30: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
3e40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e   sqlite3BtreeFin
3e50: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
3e60: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
3e70: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
3e80: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
3e90: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
3ea0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
3eb0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
3ec0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
3ed0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
3ee0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
3ef0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
3f00: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
3f10: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
3f20: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
3f30: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
3f40: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
3f50: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
3f60: 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ter..*/.#ifndef 
3f70: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
3f80: 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  t cellSize(MemPa
3f90: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
3fa0: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
3fb0: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
3fc0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
3fd0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69  pPage, iCell, &i
3fe0: 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nfo);.  return i
3ff0: 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e  nfo.nSize;.}.#en
4000: 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 63  dif.static int c
4010: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
4020: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
4030: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
4040: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
4050: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
4060: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
4070: 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72   &info);.  retur
4080: 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a  n info.nSize;.}.
4090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
40a0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
40b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
40c0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
40d0: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
40e0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
40f0: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
4100: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
4110: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
4120: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
4130: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
4140: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
4150: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
4160: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
4170: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
4180: 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a  .  if( pCell ){.
4190: 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
41a0: 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  o;.    sqlite3Bt
41b0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
41c0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
41d0: 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
41e0: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
41f0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
4200: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
4210: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  .nPayload );.   
4220: 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
4230: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
4240: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
4250: 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
4260: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
4270: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
4280: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
4290: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74  .      return pt
42a0: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
42b0: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
42c0: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
42d0: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
42e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
42f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
4300: 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  If the cell with
4310: 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20   index iCell on 
4320: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
4330: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
4340: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
4350: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
4360: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
4370: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
4380: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
4390: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
43a0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
43b0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
43c0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
43d0: 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 70 43 65 6c  8 *pCell;.  pCel
43e0: 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  l = findOverflow
43f0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
4400: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72  l);.  return ptr
4410: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
4420: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23  age, pCell);.}.#
4430: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
4440: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
4450: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
4460: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
4470: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
4480: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
4490: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
44a0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
44b0: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
44c0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
44d0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
44e0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
44f0: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
4500: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
4510: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
4520: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
4530: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
4540: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
4570: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
45a0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
45b0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
45d0: 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62  ffset of first b
45e0: 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70  yte after cell p
45f0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
4600: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4620: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
4630: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
4640: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
4650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4660: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
4670: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
4680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4690: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
46a0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
46b0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
46c0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
46d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
46e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
46f0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ray */.  int brk
4700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4710: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
4720: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
4730: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
4740: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
4750: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4760: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
4770: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
4780: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
4790: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
47a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
47b0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
47c0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
47d0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
47e0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
47f0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
4800: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
4810: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
4820: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
4830: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
4840: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
4850: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
4860: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
4870: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
4880: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
4890: 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  =0 );.  temp = s
48a0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
48b0: 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
48c0: 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70 3d  e );.  if( temp=
48d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
48e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74 61  TE_NOMEM;.  data
48f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
4900: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
4910: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
4920: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
4930: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
4940: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
4950: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
4960: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
4970: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
4980: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
4990: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
49a0: 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20 67  eSize;.  brk = g
49b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
49c0: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
49d0: 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61 74  &temp[brk], &dat
49e0: 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
49f0: 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72 6b  ze - brk);.  brk
4a00: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
4a10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
4a20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
4a30: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
4a40: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
4a50: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
4a60: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
4a70: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
4a80: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
4a90: 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Addr);.    asser
4aa0: 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74  t( pc<pPage->pBt
4ab0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
4ac0: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
4ad0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
4ae0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62 72  emp[pc]);.    br
4af0: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d  k -= size;.    m
4b00: 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b 5d  emcpy(&data[brk]
4b10: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
4b20: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
4b30: 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20 20  (pAddr, brk);.  
4b40: 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b 3e  }.  assert( brk>
4b50: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
4b60: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
4b70: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
4b80: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
4b90: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
4ba0: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
4bb0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
4bc0: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
4bd0: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
4be0: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
4bf0: 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b 0a  , 0, brk-addr);.
4c00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65 6d    sqliteFree(tem
4c10: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
4c20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4c30: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
4c40: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f  bytes of space o
4c50: 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  n a page..**.** 
4c60: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
4c70: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
4c80: 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73  ta[] of the firs
4c90: 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65  t byte of.** the
4ca0: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
4cb0: 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66 20   Or return 0 if 
4cc0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f  there is not eno
4cd0: 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61 63  ugh free.** spac
4ce0: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  e on the page to
4cf0: 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c 6c   satisfy the all
4d00: 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74 2e  ocation request.
4d10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
4d20: 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74  ge contains nByt
4d30: 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  es of free space
4d40: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f   but does not co
4d50: 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20  ntain.** nBytes 
4d60: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66 72  of contiguous fr
4d70: 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20 74  ee space, then t
4d80: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74 6f  his routine auto
4d90: 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c  matically.** cal
4da0: 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50 61  ls defragementPa
4db0: 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64  ge() to consolid
4dc0: 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70 61  ate all free spa
4dd0: 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c  ce before .** al
4de0: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65 77  locating the new
4df0: 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69   chunk..*/.stati
4e00: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
4e10: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
4e20: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  ge, int nByte){.
4e30: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c 20    int addr, pc, 
4e40: 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  hdr;.  int size;
4e50: 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20  .  int nFrag;.  
4e60: 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e  int top;.  int n
4e70: 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c  Cell;.  int cell
4e80: 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e  Offset;.  unsign
4e90: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
4ea0: 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65   .  data = pPage
4eb0: 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72  ->aData;.  asser
4ec0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
4ed0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
4ee0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
4ef0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
4f00: 42 74 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  Bt );.  if( nByt
4f10: 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b  e<4 ) nByte = 4;
4f20: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46  .  if( pPage->nF
4f30: 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61  ree<nByte || pPa
4f40: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
4f50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50  ) return 0;.  pP
4f60: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42  age->nFree -= nB
4f70: 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  yte;.  hdr = pPa
4f80: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a  ge->hdrOffset;..
4f90: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
4fa0: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
4fb0: 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ag<60 ){.    /* 
4fc0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
4fd0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
4fe0: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
4ff0: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
5000: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65  .    ** space re
5010: 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64  quest. */.    ad
5020: 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20  dr = hdr+1;.    
5030: 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74  while( (pc = get
5040: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5050: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ]))>0 ){.      s
5060: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
5070: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
5080: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
5090: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
50a0: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
50b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
50c0: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
50d0: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
50e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
50f0: 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73  r+7] = nFrag + s
5100: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5110: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5120: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5130: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
5140: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
5150: 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20   size-nByte);.  
5160: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
5170: 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  c + size - nByte
5180: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5190: 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
51a0: 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   pc;.    }.  }..
51b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
51c0: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
51d0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
51e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
51f0: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
5200: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
5210: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
5220: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5230: 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c  hdr+5]);.  nCell
5240: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5250: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c  a[hdr+3]);.  cel
5260: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5270: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69  >cellOffset;.  i
5280: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20  f( nFrag>=60 || 
5290: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
52a0: 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79  Cell > top - nBy
52b0: 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  te ){.    if( de
52c0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
52d0: 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ge) ) return 0;.
52e0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
52f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5300: 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e  ;.  }.  top -= n
5310: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
5320: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5330: 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  Cell <= top );. 
5340: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5350: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
5360: 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f  return top;.}../
5370: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65  *.** Return a se
5380: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61  ction of the pPa
5390: 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65  ge->aData to the
53a0: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68   freelist..** Th
53b0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
53c0: 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f  the new free blo
53d0: 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69  ck is pPage->aDi
53e0: 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  sk[start].** and
53f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5400: 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22   block is "size"
5410: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f   bytes..**.** Mo
5420: 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74  st of the effort
5430: 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65   here is involve
5440: 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61  d in coalesing a
5450: 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20  djacent.** free 
5460: 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69  blocks into a si
5470: 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c  ngle big free bl
5480: 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ock..*/.static v
5490: 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65  oid freeSpace(Me
54a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
54b0: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
54c0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
54d0: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75  pbegin, hdr;.  u
54e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
54f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
5500: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  a;..  assert( pP
5510: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
5520: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5530: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5540: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5550: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
5560: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
5570: 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
5580: 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61  leaf?0:4) );.  a
5590: 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20  ssert( (start + 
55a0: 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42  size)<=pPage->pB
55b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
55c0: 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20  .  if( size<4 ) 
55d0: 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64 65  size = 4;..#ifde
55e0: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
55f0: 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72  DELETE.  /* Over
5600: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
5610: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
5620: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45  eros when the SE
5630: 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a  CURE_DELETE .  *
5640: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
5650: 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
5660: 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ime */.  memset(
5670: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c  &data[start], 0,
5680: 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a   size);.#endif..
5690: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
56a0: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
56b0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
56c0: 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  freeblocks */.  
56d0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
56e0: 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d  Offset;.  addr =
56f0: 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c   hdr + 1;.  whil
5700: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
5710: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5720: 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65  ]))<start && pbe
5730: 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  gin>0 ){.    ass
5740: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
5750: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
5760: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73  ize-4 );.    ass
5770: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
5780: 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   );.    addr = p
5790: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begin;.  }.  ass
57a0: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
57b0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
57c0: 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72  ize-4 );.  asser
57d0: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
57e0: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
57f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5800: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
5810: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5820: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
5830: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
5840: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
5850: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
5860: 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a  e += size;..  /*
5870: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
5880: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
5890: 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65  /.  addr = pPage
58a0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b  ->hdrOffset + 1;
58b0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
58c0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
58d0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
58e0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
58f0: 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  size;.    assert
5900: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
5910: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
5920: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
5930: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
5940: 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74  .    pnext = get
5950: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
5960: 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20  in]);.    psize 
5970: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5980: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
5990: 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73   if( pbegin + ps
59a0: 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74  ize + 3 >= pnext
59b0: 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20   && pnext>0 ){. 
59c0: 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20       int frag = 
59d0: 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b  pnext - (pbegin+
59e0: 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73  psize);.      as
59f0: 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61  sert( frag<=data
5a00: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
5a10: 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61  t+7] );.      da
5a20: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
5a30: 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a  set+7] -= frag;.
5a40: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
5a50: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65  data[pbegin], ge
5a60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
5a70: 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74  xt]));.      put
5a80: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
5a90: 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74  in+2], pnext+get
5aa0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
5ab0: 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20  t+2])-pbegin);. 
5ac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5ad0: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
5ae0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
5af0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
5b00: 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77  nt area begins w
5b10: 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c  ith a freeblock,
5b20: 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   remove it. */. 
5b30: 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d   if( data[hdr+1]
5b40: 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26  ==data[hdr+5] &&
5b50: 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61   data[hdr+2]==da
5b60: 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20  ta[hdr+6] ){.   
5b70: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62   int top;.    pb
5b80: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
5b90: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
5ba0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
5bb0: 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62  hdr+1], &data[pb
5bc0: 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74  egin], 2);.    t
5bd0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
5be0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
5bf0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5c00: 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65  hdr+5], top + ge
5c10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
5c20: 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a  gin+2]));.  }.}.
5c30: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
5c40: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
5c50: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
5c60: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
5c70: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
5c80: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
5c90: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
5ca0: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
5cb0: 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ngly..*/.static 
5cc0: 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61 67 73  void decodeFlags
5cd0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
5ce0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
5cf0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
5d00: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
5d10: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
5d20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5d30: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
5d40: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
5d50: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 70 50 61  00 : 0) );.  pPa
5d60: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66 6c  ge->intKey = (fl
5d70: 61 67 42 79 74 65 20 26 20 28 50 54 46 5f 49 4e  agByte & (PTF_IN
5d80: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
5d90: 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  A))!=0;.  pPage-
5da0: 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c 61  >zeroData = (fla
5db0: 67 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52 4f  gByte & PTF_ZERO
5dc0: 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
5dd0: 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67 42  e->leaf = (flagB
5de0: 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29 21  yte & PTF_LEAF)!
5df0: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  =0;.  pPage->chi
5e00: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28 70  ldPtrSize = 4*(p
5e10: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a  Page->leaf==0);.
5e20: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
5e30: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
5e40: 74 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54  te & PTF_LEAFDAT
5e50: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
5e60: 6c 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20 20  leafData = 1;.  
5e70: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
5e80: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
5e90: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
5ea0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
5eb0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Leaf;.  }else{. 
5ec0: 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
5ed0: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ta = 0;.    pPag
5ee0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
5ef0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
5f00: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
5f10: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
5f20: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 68  ;.  }.  pPage->h
5f30: 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65  asData = !(pPage
5f40: 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21  ->zeroData || (!
5f50: 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70  pPage->leaf && p
5f60: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29  Page->leafData))
5f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
5f80: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
5f90: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
5fa0: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
5fb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
5fc0: 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ent parameter mu
5fd0: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
5fe0: 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 77  to the MemPage w
5ff0: 68 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20 70  hich.** is the p
6000: 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  arent of the pag
6010: 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69  e being initiali
6020: 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f  zed.  The root o
6030: 66 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61 73  f a.** BTree has
6040: 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20 73   no parent and s
6050: 6f 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2c  o for that page,
6060: 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a   pParent==NULL..
6070: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
6080: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
6090: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
60a0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
60b0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
60c0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
60d0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
60e0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
60f0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
6100: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
6110: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
6120: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
6130: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
6140: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
6150: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
6160: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
6170: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
6180: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
6190: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
61a0: 49 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50  InitPage(.  MemP
61b0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
61c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
61d0: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
61e0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
61f0: 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  Parent       /* 
6200: 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67  The parent.  Mig
6210: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
6220: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
6230: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
6240: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
6250: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
6260: 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68  ata[] */.  int h
6270: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
6280: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
6290: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
62a0: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
62b0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
62c0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
62d0: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
62e0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
62f0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
6300: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
6310: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
6320: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
6330: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
6340: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
6350: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
6360: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
6370: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
6380: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
6390: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
63a0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
63b0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
63c0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
63d0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
63e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
63f0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
6400: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
6410: 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  ea */..  pBt = p
6420: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73  Page->pBt;.  ass
6430: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
6440: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
6450: 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
6460: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73  pBt==pBt );.  as
6470: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
6480: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
6490: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
64a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
64b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
64c0: 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e  ata == &((unsign
64d0: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b  ed char*)pPage)[
64e0: 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  -pBt->pageSize] 
64f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
6500: 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74  pParent!=pParent
6510: 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72   && (pPage->pPar
6520: 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d  ent!=0 || pPage-
6530: 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20  >isInit) ){.    
6540: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61  /* The parent pa
6550: 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
6560: 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68  change unless th
6570: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
6580: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
6590: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
65a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
65b0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72  Page->isInit ) r
65c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65d0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
65e0: 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  arent==0 && pPar
65f0: 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50  ent!=0 ){.    pP
6600: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  age->pParent = p
6610: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
6620: 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
6630: 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
6640: 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65   }.  hdr = pPage
6650: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64  ->hdrOffset;.  d
6660: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
6670: 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  ta;.  decodeFlag
6680: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
6690: 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  r]);.  pPage->nO
66a0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70  verflow = 0;.  p
66b0: 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
66c0: 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   0;.  usableSize
66d0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
66e0: 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  ze;.  pPage->cel
66f0: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
6700: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
6710: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
6720: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
6730: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
6740: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
6750: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6760: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
6770: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
6780: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
6790: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
67a0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
67b0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
67c0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
67d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
67e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
67f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
6800: 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  e->nCell==0 && p
6810: 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61  Parent!=0 && pPa
6820: 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  rent->pgno!=1 ){
6830: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65  .    /* All page
6840: 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c  s must have at l
6850: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65  east one cell, e
6860: 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70  xcept for root p
6870: 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ages */.    retu
6880: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6890: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
68a0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
68b0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
68c0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
68d0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
68e0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e  ata[hdr+1]);.  n
68f0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
6900: 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c  7] + top - (cell
6910: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
6920: 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c  ->nCell);.  whil
6930: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69  e( pc>0 ){.    i
6940: 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  nt next, size;. 
6950: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
6960: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
6970: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
6980: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
6990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
69a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
69b0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65  T; .    }.    ne
69c0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
69d0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69  ata[pc]);.    si
69e0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
69f0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
6a00: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
6a10: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
6a20: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
6a30: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
6a40: 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
6a50: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
6a60: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6a70: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
6a80: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
6a90: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
6aa0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
6ab0: 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28  e = nFree;.  if(
6ac0: 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69   nFree>=usableSi
6ad0: 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65  ze ){.    /* Fre
6ae0: 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65  e space cannot e
6af0: 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65  xceed total page
6b00: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74   size */.    ret
6b10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6b20: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
6b30: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
6b40: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
6b50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6b60: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
6b70: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
6b80: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
6b90: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
6ba0: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
6bb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
6bc0: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
6bd0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
6be0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
6bf0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
6c00: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
6c10: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
6c20: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64  e->pBt;.  int hd
6c30: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
6c40: 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73  fset;.  int firs
6c50: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
6c60: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
6c70: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
6c80: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
6c90: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  o );.  assert( &
6ca0: 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  data[pBt->pageSi
6cb0: 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64  ze] == (unsigned
6cc0: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
6cd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6ce0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6cf0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6d00: 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ) );.  memset(&d
6d10: 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
6d20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
6d30: 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d  dr);.  data[hdr]
6d40: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73   = flags;.  firs
6d50: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
6d60: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
6d70: 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  )==0);.  memset(
6d80: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
6d90: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
6da0: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
6db0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
6dc0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
6dd0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
6de0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
6df0: 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64  ize - first;.  d
6e00: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
6e10: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
6e20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
6e30: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
6e40: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
6e50: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
6e60: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
6e70: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
6e80: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
6e90: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
6ea0: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  nit = 1;.}../*.*
6eb0: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
6ec0: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
6ed0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
6ee0: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
6ef0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
6f00: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
6f10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
6f20: 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73  oContent flag is
6f30: 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
6f40: 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
6f50: 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
6f60: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
6f70: 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
6f80: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
6f90: 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
6fa0: 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
6fb0: 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
6fc0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
6fd0: 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
6fe0: 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
6ff0: 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
7000: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
7010: 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
7020: 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
7030: 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
7040: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
7050: 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
7060: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
7070: 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
7080: 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
7090: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
70a0: 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
70b0: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
70c0: 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
70d0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
70e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
70f0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
7100: 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
7110: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
7120: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
7130: 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
7140: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  meter */.  int n
7150: 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20  oContent        
7160: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70  /* Do not load p
7170: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74  age content if t
7180: 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
7190: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
71a0: 50 61 67 65 3b 0a 20 20 44 62 50 61 67 65 20 2a  Page;.  DbPage *
71b0: 70 44 62 50 61 67 65 3b 0a 0a 20 20 72 63 20 3d  pDbPage;..  rc =
71c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
71d0: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
71e0: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
71f0: 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f  *)&pDbPage, noCo
7200: 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ntent);.  if( rc
7210: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7220: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
7230: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
7240: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
7250: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
7260: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
7270: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
7280: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
7290: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
72a0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
72b0: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
72c0: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
72d0: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
72e0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
72f0: 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20   : 0;.  *ppPage 
7300: 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = pPage;.  retur
7310: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7320: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
7330: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
7340: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
7350: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
7360: 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f  .** is just a co
7370: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
7380: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
7390: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  e calls to.** sq
73a0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
73b0: 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42  e() and sqlite3B
73c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
73d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
73e0: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
73f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
7400: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
7410: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7420: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
7430: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7440: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
7450: 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
7460: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
7470: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
7480: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
7490: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
74a0: 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  nt     /* Parent
74b0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
74c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
74d0: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
74e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
74f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
7500: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
7510: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
7520: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
7530: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
7540: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
7550: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
7560: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7570: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
7580: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
7590: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
75a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
75b0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
75c0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
75d0: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
75e0: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
75f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
7600: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
7610: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7620: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
7630: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
7640: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
7650: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
7660: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7670: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
7680: 20 20 61 73 73 65 72 74 28 20 26 70 50 61 67 65    assert( &pPage
7690: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70  ->aData[pPage->p
76a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d 28  Bt->pageSize]==(
76b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
76c0: 50 61 67 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  Page );.    sqli
76d0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
76e0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
76f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
7700: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7710: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
7720: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
7730: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
7740: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
7750: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
7760: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
7770: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
7780: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
7790: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
77a0: 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  r(DbPage *pData,
77b0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
77c0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
77d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
77e0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
77f0: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
7800: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
7810: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
7820: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
7830: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d  pParent ){.    M
7840: 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20  emPage *pParent 
7850: 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
7860: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61  ;.    pPage->pPa
7870: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  rent = 0;.    re
7880: 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
7890: 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  t);.  }.  pPage-
78a0: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a  >isInit = 0;.}..
78b0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
78c0: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
78d0: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
78e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
78f0: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
7900: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
7910: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
7920: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
7930: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
7940: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
7950: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
7960: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
7970: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7980: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
7990: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
79a0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
79b0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
79c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
79d0: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
79e0: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
79f0: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
7a00: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
7a10: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
7a20: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
7a30: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
7a40: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
7a50: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
7a60: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
7a70: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
7a80: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
7a90: 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  a);.  if( pPage-
7aa0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 70  >isInit ){.    p
7ab0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
7ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
7ad0: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
7ae0: 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
7af0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7b00: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
7b10: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
7b20: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
7b30: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7b40: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
7b50: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
7b60: 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  * a new database
7b70: 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e   with a random n
7b80: 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ame is created. 
7b90: 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e   This randomly n
7ba0: 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  amed.** database
7bb0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
7bc0: 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74  leted when sqlit
7bd0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
7be0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74  s called..*/.int
7bf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
7c00: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
7c10: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
7c20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
7c30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7c40: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
7c50: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53 71  /.  sqlite3 *pSq
7c60: 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 41  lite,       /* A
7c70: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
7c80: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
7c90: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
7ca0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7cb0: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
7cc0: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
7cd0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
7ce0: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
7cf0: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b  /* Options */.){
7d00: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
7d10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
7d20: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
7d30: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
7d40: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
7d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
7d60: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
7d70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7d80: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65  TE_OK;.  int nRe
7d90: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
7da0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
7db0: 5b 31 30 30 5d 3b 0a 23 69 66 20 21 64 65 66 69  [100];.#if !defi
7dc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7dd0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
7de0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7df0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
7e00: 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61  const ThreadData
7e10: 20 2a 70 54 73 64 72 6f 3b 0a 23 65 6e 64 69 66   *pTsdro;.#endif
7e20: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
7e30: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
7e40: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
7e50: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
7e60: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
7e70: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
7e80: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
7e90: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
7ea0: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
7eb0: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
7ec0: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
7ed0: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
7ee0: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
7ef0: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
7f00: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
7f10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7f20: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
7f30: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
7f40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7f50: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
7f60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
7f70: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
7f80: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
7f90: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
7fa0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
7fb0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
7fc0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
7fd0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
7fe0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
7ff0: 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   p = sqliteMallo
8000: 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  c(sizeof(Btree))
8010: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
8020: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8030: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
8040: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
8050: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69  NONE;.  p->pSqli
8060: 74 65 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 20  te = pSqlite;.. 
8070: 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
8080: 61 6e 20 65 78 69 73 74 69 6e 67 20 42 74 72 65  an existing Btre
8090: 65 20 73 74 72 75 63 74 75 72 65 20 6f 70 65 6e  e structure open
80a0: 65 64 20 6f 6e 20 7a 46 69 6c 65 6e 61 6d 65 2e  ed on zFilename.
80b0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
80c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
80d0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
80e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
80f0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 70 54 73  IT_DISKIO).  pTs
8100: 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
8110: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
8120: 29 3b 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d  );.  if( pTsdro-
8130: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 26  >useSharedData &
8140: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  & zFilename && !
8150: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 63  isMemdb ){.    c
8160: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
8170: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
8180: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
8190: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  name);.    if( !
81a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
81b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
81c0: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
81d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
81e0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
81f0: 42 74 3d 70 54 73 64 72 6f 2d 3e 70 42 74 72 65  Bt=pTsdro->pBtre
8200: 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  e; pBt; pBt=pBt-
8210: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
8220: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
8230: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
8240: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
8250: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
8260: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
8270: 74 2d 3e 70 50 61 67 65 72 29 29 20 29 7b 0a 20  t->pPager)) ){. 
8280: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
8290: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  pBt;.        *pp
82a0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  Btree = p;.     
82b0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
82c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
82d0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
82e0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
82f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
8300: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8310: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
8320: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  athname);.  }.#e
8330: 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
8340: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
8350: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
8360: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
8370: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
8380: 65 20 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 72  e are.  ** the r
8390: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
83a0: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
83b0: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
83c0: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
83d0: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
83e0: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
83f0: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
8400: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69   */.  assert( si
8410: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
8420: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
8430: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
8440: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
8450: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
8460: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
8470: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (u32)==4 );.  as
8480: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
8490: 29 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  )==2 );.  assert
84a0: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
84b0: 34 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 73 71  4 );..  pBt = sq
84c0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
84d0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 69 66  of(*pBt) );.  if
84e0: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
84f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8500: 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 74 72 65  M;.    goto btre
8510: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a  e_open_out;.  }.
8520: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
8530: 67 65 72 4f 70 65 6e 28 26 70 42 74 2d 3e 70 50  gerOpen(&pBt->pP
8540: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
8550: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
8560: 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  gs);.  if( rc==S
8570: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8580: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8590: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
85a0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
85b0: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
85c0: 62 48 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20  bHeader);.  }.  
85d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
85e0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 74  K ){.    goto bt
85f0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
8600: 7d 0a 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74  }.  p->pBt = pBt
8610: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
8620: 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70  rSetDestructor(p
8630: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
8640: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 73  Destructor);.  s
8650: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
8660: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
8670: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
8680: 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
8690: 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  = 0;.  pBt->pPag
86a0: 65 31 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 72  e1 = 0;.  pBt->r
86b0: 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65  eadOnly = sqlite
86c0: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
86d0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
86e0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
86f0: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
8700: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69 66 28  ader[16]);.  if(
8710: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
8720: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
8730: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
8740: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
8750: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
8760: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
8770: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ize)!=0 ){.    p
8780: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  Bt->pageSize = S
8790: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
87a0: 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70 42 74  GE_SIZE;.    pBt
87b0: 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d  ->maxEmbedFrac =
87c0: 20 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f   64;   /* 25% */
87d0: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62  .    pBt->minEmb
87e0: 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f  edFrac = 32;   /
87f0: 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 70  * 12.5% */.    p
8800: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20  Bt->minLeafFrac 
8810: 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e 35  = 32;    /* 12.5
8820: 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  % */.#ifndef SQL
8830: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8840: 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
8850: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
8860: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
8870: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
8880: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
8890: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
88a0: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
88b0: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
88c0: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
88d0: 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
88e0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
88f0: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
8900: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
8910: 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
8920: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8930: 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
8940: 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
8950: 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
8960: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
8970: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
8980: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
8990: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
89a0: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 2a 2f  r normal..    */
89b0: 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
89c0: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
89d0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  {.      pBt->aut
89e0: 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
89f0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
8a00: 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
8a10: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
8a20: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
8a30: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
8a40: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
8a50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
8a60: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
8a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65  }else{.    nRese
8a80: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
8a90: 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  20];.    pBt->ma
8aa0: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62  xEmbedFrac = zDb
8ab0: 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20  Header[21];.    
8ac0: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
8ad0: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32  c = zDbHeader[22
8ae0: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
8af0: 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61  eafFrac = zDbHea
8b00: 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74  der[23];.    pBt
8b10: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
8b20: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
8b30: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8b40: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
8b50: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
8b60: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
8b70: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
8b80: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74  #endif.  }.  pBt
8b90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
8ba0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
8bb0: 52 65 73 65 72 76 65 3b 0a 20 20 61 73 73 65 72  Reserve;.  asser
8bc0: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
8bd0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
8be0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
8bf0: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
8c00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
8c10: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
8c20: 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 70 61 67  pPager, pBt->pag
8c30: 65 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21 64 65  eSize);..#if !de
8c40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8c50: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
8c60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
8c70: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
8c80: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
8c90: 20 62 74 72 65 65 20 74 6f 20 74 68 65 20 6c 69   btree to the li
8ca0: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
8cb0: 6e 67 20 61 74 20 54 68 72 65 61 64 44 61 74 61  ng at ThreadData
8cc0: 2e 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68  .pBtree..  ** Th
8cd0: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
8ce0: 20 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29   that a malloc()
8cf0: 20 6d 61 79 20 66 61 69 6c 20 69 6e 73 69 64 65   may fail inside
8d00: 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 71   of the .  ** sq
8d10: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
8d20: 29 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 54  ) call, as the T
8d30: 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74  hreadData struct
8d40: 75 72 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ure must have al
8d50: 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
8d60: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 70 54  allocated for pT
8d70: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
8d80: 61 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65  ata to be non-ze
8d90: 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ro..  */.  if( p
8da0: 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64  Tsdro->useShared
8db0: 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d  Data && zFilenam
8dc0: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
8dd0: 0a 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20  .    pBt->pNext 
8de0: 3d 20 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65  = pTsdro->pBtree
8df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72  ;.    sqlite3Thr
8e00: 65 61 64 44 61 74 61 28 29 2d 3e 70 42 74 72 65  eadData()->pBtre
8e10: 65 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e  e = pBt;.  }.#en
8e20: 64 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20  dif.  pBt->nRef 
8e30: 3d 20 31 3b 0a 20 20 2a 70 70 42 74 72 65 65 20  = 1;.  *ppBtree 
8e40: 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
8e50: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
8e60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8e70: 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
8e80: 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
8e90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
8ea0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
8eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8ec0: 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  eFree(pBt);.    
8ed0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20  sqliteFree(p);. 
8ee0: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
8ef0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8f10: 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
8f20: 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
8f30: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
8f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
8f50: 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
8f60: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
8f70: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
8f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 23  Cursor *pCur;..#
8f90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8fa0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
8fb0: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
8fc0: 73 64 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  sd;.#endif..  /*
8fd0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
8fe0: 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
8ff0: 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
9000: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
9010: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
9020: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
9030: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
9040: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
9050: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
9060: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
9070: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
9080: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
9090: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
90a0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
90b0: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
90c0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
90d0: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
90e0: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
90f0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
9100: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
9110: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
9120: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
9130: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
9140: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
9150: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
9160: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
9170: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
9180: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
9190: 43 48 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  CHE.  /* If ther
91a0: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
91b0: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
91c0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
91d0: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
91e0: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
91f0: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
9200: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
9210: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
9220: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
9230: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
9240: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
9250: 52 65 66 3e 30 20 29 3b 0a 20 20 70 42 74 2d 3e  Ref>0 );.  pBt->
9260: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
9270: 74 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 72  t->nRef ){.    r
9280: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9290: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
92a0: 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  e the shared-btr
92b0: 65 65 20 66 72 6f 6d 20 74 68 65 20 74 68 72 65  ee from the thre
92c0: 61 64 20 77 69 64 65 20 6c 69 73 74 2e 20 43 61  ad wide list. Ca
92d0: 6c 6c 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44  ll .  ** ThreadD
92e0: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 20 61 6e  ataReadOnly() an
92f0: 64 20 74 68 65 6e 20 63 61 73 74 20 61 77 61 79  d then cast away
9300: 20 74 68 65 20 63 6f 6e 73 74 20 70 72 6f 70 65   the const prope
9310: 72 74 79 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  rty of the .  **
9320: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69   pointer to avoi
9330: 64 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 72  d allocating thr
9340: 65 61 64 20 64 61 74 61 20 69 66 20 69 74 20 69  ead data if it i
9350: 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 72 65 71  s not really req
9360: 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54  uired..  */.  pT
9370: 73 64 20 3d 20 28 54 68 72 65 61 64 44 61 74 61  sd = (ThreadData
9380: 20 2a 29 73 71 6c 69 74 65 33 54 68 72 65 61 64   *)sqlite3Thread
9390: 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  DataReadOnly();.
93a0: 20 20 69 66 28 20 70 54 73 64 2d 3e 70 42 74 72    if( pTsd->pBtr
93b0: 65 65 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 61  ee==pBt ){.    a
93c0: 73 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c  ssert( pTsd==sql
93d0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
93e0: 20 29 3b 0a 20 20 20 20 70 54 73 64 2d 3e 70 42   );.    pTsd->pB
93f0: 74 72 65 65 20 3d 20 70 42 74 2d 3e 70 4e 65 78  tree = pBt->pNex
9400: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
9410: 42 74 53 68 61 72 65 64 20 2a 70 50 72 65 76 3b  BtShared *pPrev;
9420: 0a 20 20 20 20 66 6f 72 28 70 50 72 65 76 3d 70  .    for(pPrev=p
9430: 54 73 64 2d 3e 70 42 74 72 65 65 3b 20 70 50 72  Tsd->pBtree; pPr
9440: 65 76 20 26 26 20 70 50 72 65 76 2d 3e 70 4e 65  ev && pPrev->pNe
9450: 78 74 21 3d 70 42 74 3b 20 70 50 72 65 76 3d 70  xt!=pBt; pPrev=p
9460: 50 72 65 76 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  Prev->pNext){}. 
9470: 20 20 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a     if( pPrev ){.
9480: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
9490: 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61  sd==sqlite3Threa
94a0: 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 20  dData() );.     
94b0: 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
94c0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
94d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
94e0: 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 70 61 67  /* Close the pag
94f0: 65 72 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  er and free the 
9500: 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
9510: 75 63 74 75 72 65 20 2a 2f 0a 20 20 61 73 73 65  ucture */.  asse
9520: 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
9530: 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  r );.  sqlite3Pa
9540: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
9550: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 42 74  ager);.  if( pBt
9560: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
9570: 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
9580: 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53  .    pBt->xFreeS
9590: 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
95a0: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
95b0: 65 46 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  eFree(pBt->pSche
95c0: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ma);.  sqliteFre
95d0: 65 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  e(pBt);.  return
95e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
95f0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
9600: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c  busy handler cal
9610: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
9620: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
9630: 72 65 65 53 65 74 42 75 73 79 48 61 6e 64 6c 65  reeSetBusyHandle
9640: 72 28 42 74 72 65 65 20 2a 70 2c 20 42 75 73 79  r(Btree *p, Busy
9650: 48 61 6e 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65  Handler *pHandle
9660: 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  r){.  BtShared *
9670: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
9680: 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  pBt->pBusyHandle
9690: 72 20 3d 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20  r = pHandler;.  
96a0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
96b0: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
96c0: 70 50 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72  pPager, pHandler
96d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
96e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
96f0: 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
9700: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
9710: 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
9720: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
9730: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
9740: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
9750: 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
9760: 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
9770: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
9780: 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
9790: 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
97a0: 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
97b0: 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
97c0: 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
97d0: 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
97e0: 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
97f0: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
9800: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
9810: 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
9820: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
9830: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
9840: 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
9850: 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
9860: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
9870: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
9880: 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
9890: 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
98a0: 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
98b0: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
98c0: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
98d0: 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
98e0: 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
98f0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
9900: 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
9910: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
9920: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
9930: 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
9940: 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
9950: 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
9960: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
9970: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
9980: 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
9990: 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
99a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
99b0: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
99c0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
99d0: 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
99e0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
99f0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
9a00: 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
9a10: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
9a20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
9a30: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9a40: 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
9a50: 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
9a60: 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
9a70: 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
9a80: 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
9a90: 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
9aa0: 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
9ab0: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
9ac0: 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
9ad0: 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
9ae0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
9af0: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
9b00: 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
9b10: 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
9b20: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
9b30: 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
9b40: 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
9b50: 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
9b60: 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
9b70: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
9b80: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
9b90: 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
9ba0: 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
9bb0: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
9bc0: 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
9bd0: 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
9be0: 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
9bf0: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
9c00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
9c10: 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
9c20: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
9c30: 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
9c40: 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
9c50: 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
9c60: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
9c70: 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
9c80: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
9c90: 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
9ca0: 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
9cb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
9cc0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
9cd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
9ce0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
9cf0: 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
9d00: 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
9d10: 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
9d20: 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
9d30: 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
9d40: 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
9d50: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
9d60: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
9d70: 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
9d80: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
9d90: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
9da0: 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
9db0: 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 65  ->pPager );.  re
9dc0: 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
9dd0: 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
9de0: 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  ger);.}..#if !de
9df0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9e00: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
9e10: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
9e20: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
9e30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
9e40: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
9e50: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
9e60: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
9e70: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
9e80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
9e90: 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
9ea0: 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
9eb0: 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
9ec0: 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
9ed0: 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
9ee0: 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
9ef0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
9f00: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
9f10: 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
9f20: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
9f30: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
9f40: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
9f50: 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
9f60: 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
9f70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9f80: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
9f90: 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
9fa0: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
9fb0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
9fc0: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
9fd0: 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
9fe0: 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
9ff0: 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
a000: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
a010: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
a020: 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
a030: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
a040: 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
a050: 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
a060: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
a070: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
a080: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
a090: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
a0a0: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
a0b0: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
a0c0: 65 73 65 72 76 65 29 7b 0a 20 20 42 74 53 68 61  eserve){.  BtSha
a0d0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
a0e0: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  t;.  if( pBt->pa
a0f0: 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
a100: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a110: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
a120: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
a130: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
a140: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
a150: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
a160: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67  e;.  }.  if( pag
a170: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
a180: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
a190: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
a1a0: 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
a1b0: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
a1c0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
a1d0: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
a1e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
a1f0: 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
a200: 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
a210: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
a220: 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
a230: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
a240: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
a250: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
a260: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
a270: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
a280: 6e 52 65 73 65 72 76 65 3b 0a 20 20 72 65 74 75  nReserve;.  retu
a290: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a2a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a2b0: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
a2c0: 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
a2d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
a2e0: 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
a2f0: 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
a300: 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
a310: 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
a320: 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
a330: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
a340: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
a350: 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
a360: 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e  sableSize;.}.#en
a370: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
a380: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
a390: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
a3a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a3b0: 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
a3c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
a3d0: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
a3e0: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
a3f0: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
a400: 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
a410: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
a420: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
a430: 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
a440: 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
a450: 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
a460: 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
a470: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
a480: 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
a490: 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
a4a0: 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
a4b0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
a4c0: 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
a4d0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
a4e0: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
a4f0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
a500: 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
a510: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
a520: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
a530: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
a540: 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
a550: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
a560: 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74  .  int av = (aut
a570: 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20  oVacuum?1:0);.  
a580: 69 6e 74 20 69 76 20 3d 20 28 61 75 74 6f 56 61  int iv = (autoVa
a590: 63 75 75 6d 3d 3d 42 54 52 45 45 5f 41 55 54 4f  cuum==BTREE_AUTO
a5a0: 56 41 43 55 55 4d 5f 49 4e 43 52 3f 31 3a 30 29  VACUUM_INCR?1:0)
a5b0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
a5c0: 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 61 76  eSizeFixed && av
a5d0: 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
a5e0: 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  m ){.    return 
a5f0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
a600: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f  .  }.  pBt->auto
a610: 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 70  Vacuum = av;.  p
a620: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
a630: 20 69 76 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   iv;.  return SQ
a640: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
a650: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a660: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
a670: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
a680: 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
a690: 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
a6a0: 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
a6b0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
a6c0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
a6d0: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
a6e0: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
a6f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
a700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
a710: 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
a720: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
a730: 73 65 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20  se.  return (.  
a740: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
a750: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
a760: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
a770: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
a780: 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
a790: 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
a7a0: 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
a7b0: 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 23  CUUM_INCR.  );.#
a7c0: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
a7d0: 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
a7e0: 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
a7f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
a800: 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
a810: 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
a820: 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
a830: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
a840: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
a850: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
a860: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
a870: 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
a880: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
a890: 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
a8a0: 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
a8b0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
a8c0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
a8d0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
a8e0: 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
a8f0: 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
a900: 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
a910: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
a920: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
a930: 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
a940: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  pBt){.  int rc, 
a950: 70 61 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50  pageSize;.  MemP
a960: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
a970: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
a980: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a990: 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  K;.  rc = sqlite
a9a0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
a9b0: 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
a9c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a9d0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
a9e0: 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20  rc;.  ..  /* Do 
a9f0: 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
aa00: 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
aa10: 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
aa20: 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
aa30: 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
aa40: 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63  file. .  */.  rc
aa50: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
aa60: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50  ;.  if( sqlite3P
aa70: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
aa80: 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a  t->pPager)>0 ){.
aa90: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
aaa0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
aab0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
aac0: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
aad0: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
aae0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
aaf0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
ab00: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
ab10: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
ab20: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
ab30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ab40: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
ab50: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
ab60: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
ab70: 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
ab80: 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
ab90: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
aba0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
abb0: 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67  eSize)!=0 || pag
abc0: 65 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20  eSize<512 ){.   
abd0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
abe0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
abf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
ac00: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
ac10: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
ac20: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
ac30: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
ac40: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
ac50: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
ac60: 69 66 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  if( pBt->usableS
ac70: 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20  ize<500 ){.     
ac80: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
ac90: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
aca0: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
acb0: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d  Frac = page1[21]
acc0: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d  ;.    pBt->minEm
acd0: 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b  bedFrac = page1[
ace0: 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  22];.    pBt->mi
acf0: 6e 4c 65 61 66 46 72 61 63 20 3d 20 70 61 67 65  nLeafFrac = page
ad00: 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53  1[23];.#ifndef S
ad10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
ad20: 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
ad30: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
ad40: 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
ad50: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 4*4])?1:0);.#e
ad60: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
ad70: 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
ad80: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
ad90: 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
ada0: 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
adb0: 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
adc0: 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
add0: 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
ade0: 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
adf0: 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
ae00: 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
ae10: 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
ae20: 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
ae30: 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
ae40: 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
ae50: 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
ae60: 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
ae70: 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
ae80: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
ae90: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
aea0: 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
aeb0: 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
aec0: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
aed0: 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
aee0: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
aef0: 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
af00: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
af10: 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
af20: 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
af30: 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ner, a header wh
af40: 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
af50: 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
af60: 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
af70: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
af80: 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
af90: 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
afa0: 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
afb0: 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
afc0: 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  xLocal = (pBt->u
afd0: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42  sableSize-12)*pB
afe0: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f  t->maxEmbedFrac/
aff0: 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
b000: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
b010: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
b020: 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72  *pBt->minEmbedFr
b030: 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  ac/255 - 23;.  p
b040: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
b050: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
b060: 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
b070: 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
b080: 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d  eSize-12)*pBt->m
b090: 69 6e 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d  inLeafFrac/255 -
b0a0: 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e   23;.  if( pBt->
b0b0: 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61  minLocal>pBt->ma
b0c0: 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d  xLocal || pBt->m
b0d0: 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20  axLocal<0 ){.   
b0e0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
b0f0: 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61  _failed;.  }.  a
b100: 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
b110: 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
b120: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
b130: 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
b140: 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72   pPage1;.  retur
b150: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
b160: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
b170: 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
b180: 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
b190: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
b1a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b1b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
b1c0: 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72  rks like lockBtr
b1d0: 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  ee() except that
b1e0: 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73   it also invokes
b1f0: 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c   the.** busy cal
b200: 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69  lback if there i
b210: 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  s lock contentio
b220: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b230: 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
b240: 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29  try(Btree *pRef)
b250: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b260: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52  ITE_OK;.  if( pR
b270: 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  ef->inTrans==TRA
b280: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75  NS_NONE ){.    u
b290: 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  8 inTransaction 
b2a0: 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54  = pRef->pBt->inT
b2b0: 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
b2c0: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
b2d0: 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Ref);.    rc = s
b2e0: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
b2f0: 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a  Trans(pRef, 0);.
b300: 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69      pRef->pBt->i
b310: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69  nTransaction = i
b320: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
b330: 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20    pRef->inTrans 
b340: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
b350: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b360: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65  _OK ){.      pRe
b370: 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  f->pBt->nTransac
b380: 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  tion--;.    }.  
b390: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
b3a0: 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (pRef);.  }.  re
b3b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20  turn rc;.}.     
b3c0: 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65    ../*.** If the
b3d0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
b3e0: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
b3f0: 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
b400: 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
b410: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
b420: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
b430: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
b440: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
b450: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
b460: 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
b470: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
b480: 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
b490: 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
b4a0: 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
b4b0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
b4c0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
b4d0: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
b4e0: 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72   cursors, this r
b4f0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
b500: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  p..**.** If ther
b510: 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
b520: 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
b530: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b540: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
b550: 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
b560: 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
b570: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
b580: 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
b590: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
b5a0: 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72   && pBt->pCursor
b5b0: 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ==0 && pBt->pPag
b5c0: 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  e1!=0 ){.    if(
b5d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
b5e0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
b5f0: 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  r)>=1 ){.      i
b600: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  f( pBt->pPage1->
b610: 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
b620: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
b630: 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  ge = pBt->pPage1
b640: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
b650: 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
b660: 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67  pPage)[-pBt->pag
b670: 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  eSize];.        
b680: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
b690: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
b6a0: 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20  >pgno = 1;.     
b6b0: 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
b6c0: 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
b6d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  );.    }.    pBt
b6e0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
b6f0: 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
b700: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
b710: 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
b720: 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
b730: 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
b740: 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
b750: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
b760: 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
b770: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
b780: 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
b790: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b7a0: 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
b7b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
b7c0: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
b7d0: 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65 74  >pPager)>0 ) ret
b7e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b7f0: 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
b800: 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
b810: 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
b820: 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
b830: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
b840: 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
b850: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
b860: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
b870: 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
b880: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
b890: 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
b8a0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
b8b0: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
b8c0: 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
b8d0: 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
b8e0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
b8f0: 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
b900: 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[19] = 1;.  dat
b910: 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67  a[20] = pBt->pag
b920: 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
b930: 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b  bleSize;.  data[
b940: 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d  21] = pBt->maxEm
b950: 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
b960: 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d  22] = pBt->minEm
b970: 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
b980: 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  23] = pBt->minLe
b990: 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74  afFrac;.  memset
b9a0: 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
b9b0: 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
b9c0: 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
b9d0: 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
b9e0: 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
b9f0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
ba00: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
ba10: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ba20: 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
ba30: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
ba40: 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
ba50: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
ba60: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
ba70: 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
ba80: 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
ba90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
baa0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  OK;.}../*.** Att
bab0: 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
bac0: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
bad0: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
bae0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
baf0: 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
bb00: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
bb10: 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
bb20: 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
bb30: 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
bb40: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
bb50: 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
bb60: 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
bb70: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
bb80: 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
bb90: 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
bba0: 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
bbb0: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
bbc0: 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
bbd0: 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
bbe0: 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
bbf0: 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
bc00: 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
bc10: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
bc20: 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
bc30: 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
bc40: 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
bc50: 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
bc60: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
bc70: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
bc80: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
bc90: 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
bca0: 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
bcb0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
bcc0: 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
bcd0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
bce0: 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
bcf0: 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
bd00: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
bd10: 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
bd20: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
bd30: 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
bd40: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
bd50: 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
bd60: 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
bd70: 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
bd80: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
bd90: 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
bda0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
bdb0: 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
bdc0: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
bdd0: 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
bde0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
bdf0: 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
be00: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
be10: 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
be20: 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
be30: 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
be40: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
be50: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
be60: 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
be70: 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
be80: 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
be90: 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
bea0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
beb0: 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
bec0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
bed0: 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
bee0: 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
bef0: 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
bf00: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
bf10: 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
bf20: 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
bf30: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
bf40: 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
bf50: 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
bf60: 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
bf70: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
bf80: 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
bf90: 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
bfa0: 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
bfb0: 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
bfc0: 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
bfd0: 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
bfe0: 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
bff0: 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
c000: 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
c010: 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
c020: 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
c030: 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
c040: 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
c050: 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
c060: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
c070: 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
c080: 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
c090: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
c0a0: 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
c0b0: 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
c0c0: 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
c0d0: 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
c0e0: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
c0f0: 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
c100: 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
c110: 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
c120: 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
c130: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
c140: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
c150: 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
c160: 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
c170: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c180: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
c190: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c1a0: 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
c1b0: 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
c1c0: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
c1d0: 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
c1e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
c1f0: 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
c200: 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
c210: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
c220: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
c230: 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
c240: 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
c250: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
c260: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
c270: 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
c280: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
c290: 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
c2a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c2b0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
c2c0: 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
c2d0: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
c2e0: 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
c2f0: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
c300: 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
c310: 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
c320: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c330: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
c340: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  ..  /* If anothe
c350: 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
c360: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
c370: 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
c380: 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
c390: 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
c3a0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
c3b0: 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
c3c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
c3d0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
c3e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
c3f0: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  SY..  */.  if( p
c400: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
c410: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
c420: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
c430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
c440: 53 59 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a  SY;.  }..  do {.
c450: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
c460: 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge1==0 ){.      
c470: 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
c480: 42 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Bt);.    }..    
c490: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c4a0: 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
c4b0: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
c4c0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
c4d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
c4e0: 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
c4f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
c500: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
c510: 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  gin(pBt->pPage1-
c520: 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67  >pDbPage, wrflag
c530: 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >1);.        if(
c540: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c550: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
c560: 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
c570: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c580: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
c590: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c5a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
c5b0: 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69   wrflag ) pBt->i
c5c0: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
c5d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  else{.      unlo
c5e0: 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
c5f0: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
c600: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
c610: 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
c620: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
c630: 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
c640: 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 76 6f       sqlite3Invo
c650: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
c660: 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  t->pBusyHandler)
c670: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
c680: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c690: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
c6a0: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
c6b0: 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
c6c0: 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ction++;.    }. 
c6d0: 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
c6e0: 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
c6f0: 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
c700: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
c710: 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
c720: 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
c730: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
c740: 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
c750: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74  .    }.  }..  bt
c760: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
c770: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c780: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c790: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
c7a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
c7b0: 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
c7c0: 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
c7d0: 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
c7e0: 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
c7f0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
c800: 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
c810: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
c820: 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
c830: 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
c840: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
c850: 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
c860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c870: 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
c880: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
c890: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
c8c0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
c8d0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
c900: 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
c910: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
c920: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
c930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c940: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
c950: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
c960: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
c970: 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
c980: 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
c990: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
c9a0: 3e 70 67 6e 6f 3b 0a 0a 20 20 73 71 6c 69 74 65  >pgno;..  sqlite
c9b0: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
c9c0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 6e 43 65 6c  Page, 0);.  nCel
c9d0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
c9e0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
c9f0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
ca00: 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 73 71 6c   u8 *pCell = sql
ca10: 69 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c  ite3BtreeFindCel
ca20: 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
ca30: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
ca40: 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
ca50: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
ca60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ca70: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63        goto set_c
ca80: 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
ca90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
caa0: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
cab0: 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
cac0: 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
cad0: 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72  (pCell);.      r
cae0: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
caf0: 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
cb00: 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
cb10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
cb20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
cb30: 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
cb40: 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  aps_out;.    }. 
cb50: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
cb60: 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
cb70: 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
cb80: 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
cb90: 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
cba0: 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
cbb0: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
cbc0: 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
cbd0: 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
cbe0: 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  o);.  }..set_chi
cbf0: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
cc00: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
cc10: 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
cc20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cc30: 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
cc40: 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73   pPage, which is
cc50: 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
cc60: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20  e a btree page, 
cc70: 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a  not an overflow.
cc80: 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f  ** page, is a po
cc90: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
cca0: 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73  rom. Modify this
ccb0: 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74   pointer so that
ccc0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
ccd0: 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
cce0: 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
ccf0: 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
cd00: 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  ter to be modifi
cd10: 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f  ed, as .** follo
cd20: 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
cd30: 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
cd40: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
cd50: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
cd60: 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
cd70: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
cd80: 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
cd90: 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
cda0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
cdb0: 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
cdc0: 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
cdd0: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
cde0: 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
ce00: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
ce10: 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
ce20: 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
ce30: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
ce40: 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
ce50: 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
ce60: 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
ce70: 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
cea0: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
ceb0: 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
cec0: 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
ced0: 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
cee0: 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
cef0: 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 69  , u8 eType){.  i
cf00: 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
cf10: 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
cf20: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
cf30: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
cf40: 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
cf50: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
cf60: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
cf70: 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
cf80: 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
cf90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cfa0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
cfb0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
cfc0: 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
cfd0: 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
cfe0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73  else{.    int is
cff0: 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
d000: 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
d010: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
d020: 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ll;..    sqlite3
d030: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
d040: 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65  age, 0);.    nCe
d050: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
d060: 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
d070: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
d080: 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
d090: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  = sqlite3BtreeFi
d0a0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
d0b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
d0c0: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
d0d0: 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
d0e0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
d0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
d100: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
d110: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
d120: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
d130: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
d140: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
d150: 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
d160: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
d170: 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20  erflow]) ){.    
d180: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
d190: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
d1a0: 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
d1b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
d1c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d1e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
d1f0: 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
d200: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
d210: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
d220: 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
d230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d240: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d250: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
d260: 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
d270: 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
d280: 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
d290: 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
d2a0: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
d2b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
d2c0: 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
d2d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d2e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d2f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d300: 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
d310: 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
d320: 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
d330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
d340: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
d350: 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
d360: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d370: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
d380: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
d390: 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
d3a0: 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
d3b0: 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
d3c0: 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
d3d0: 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
d3e0: 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f  emains valid..*/
d3f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
d400: 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
d410: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
d420: 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
d430: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
d440: 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
d450: 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
d460: 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d480: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
d490: 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
d4a0: 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
d4b0: 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
d4c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
d4d0: 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
d4e0: 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
d4f0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
d500: 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
d510: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
d520: 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
d530: 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
d540: 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
d550: 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
d560: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
d570: 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
d580: 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
d590: 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
d5a0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
d5b0: 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
d5c0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
d5d0: 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
d5e0: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
d5f0: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
d600: 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
d610: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
d620: 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
d630: 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
d640: 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
d650: 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
d660: 74 27 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  t's current loca
d670: 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
d680: 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
d690: 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
d6a0: 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
d6b0: 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
d6c0: 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
d6d0: 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
d6e0: 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
d6f0: 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
d700: 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
d710: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
d720: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
d730: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
d740: 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28  FreePage);.  if(
d750: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d770: 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
d780: 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
d790: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
d7a0: 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
d7b0: 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
d7c0: 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
d7d0: 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
d7e0: 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
d7f0: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
d800: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
d810: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
d820: 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
d830: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
d840: 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
d850: 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
d860: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
d870: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
d880: 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
d890: 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
d8a0: 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
d8b0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
d8c0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
d8d0: 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
d8e0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
d8f0: 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
d900: 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
d910: 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
d920: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
d930: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
d940: 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
d950: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
d960: 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
d970: 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
d980: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
d990: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d9a0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d9b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
d9c0: 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
d9d0: 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
d9e0: 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
d9f0: 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
da00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
da10: 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
da20: 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
da30: 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
da40: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
da50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
da60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
da70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
da80: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
da90: 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
daa0: 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
dab0: 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
dac0: 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
dad0: 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
dae0: 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
daf0: 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
db00: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
db10: 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
db20: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
db30: 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
db40: 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
db50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
db60: 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
db70: 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
db80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
db90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dba0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
dbb0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
dbc0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
dbd0: 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
dbe0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
dbf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dc00: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
dc10: 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
dc20: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
dc30: 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
dc40: 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
dc50: 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
dc60: 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
dc70: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
dc80: 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
dc90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dca0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
dcb0: 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
dcc0: 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
dcd0: 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
dce0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
dcf0: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
dd00: 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
dd10: 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
dd20: 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
dd30: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
dd40: 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
dd50: 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
dd60: 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
dd70: 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
dd80: 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
dd90: 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
dda0: 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
ddb0: 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
ddc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
ddd0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
dde0: 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
ddf0: 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
de00: 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
de10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
de20: 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
de30: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
de40: 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
de50: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
de60: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
de70: 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
de80: 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
de90: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
dea0: 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
deb0: 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
dec0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
ded0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
dee0: 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
def0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
df00: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
df10: 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
df20: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
df30: 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
df40: 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
df50: 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
df60: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
df70: 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
df80: 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
df90: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
dfa0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
dfb0: 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
dfc0: 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
dfd0: 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
dfe0: 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
dff0: 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
e000: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
e010: 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50   Pgno nFin){.  P
e020: 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20  gno iLastPg;    
e030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
e040: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
e050: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
e060: 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
e070: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e080: 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
e090: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
e0a0: 2f 0a 0a 20 20 69 4c 61 73 74 50 67 20 3d 20 70  /..  iLastPg = p
e0b0: 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69 66  Bt->nTrunc;.  if
e0c0: 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b 0a  ( iLastPg==0 ){.
e0d0: 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20 73 71      iLastPg = sq
e0e0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
e0f0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
e100: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50 54  ;.  }..  if( !PT
e110: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
e120: 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
e130: 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
e140: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
e150: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
e160: 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
e170: 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
e180: 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
e190: 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
e1a0: 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
e1b0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
e1c0: 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69  st==0 || nFin==i
e1d0: 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20  LastPg ){.      
e1e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
e1f0: 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
e200: 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
e210: 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
e220: 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
e230: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e240: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
e250: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e260: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
e270: 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
e280: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e290: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e2a0: 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
e2b0: 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
e2c0: 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
e2d0: 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29     if( nFin==0 )
e2e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
e2f0: 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
e300: 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
e310: 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
e320: 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
e330: 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69      ** if nFin i
e340: 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
e350: 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 66 72  his case, the fr
e360: 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
e370: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
e380: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
e390: 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
e3a0: 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
e3b0: 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
e3c0: 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
e3d0: 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
e3e0: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
e3f0: 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
e400: 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
e410: 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
e420: 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
e430: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
e440: 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
e450: 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
e460: 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
e470: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
e480: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
e4a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
e4b0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
e4c0: 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
e4d0: 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
e4e0: 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
e4f0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
e500: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
e510: 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
e520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
e530: 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
e540: 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
e550: 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
e560: 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20  ge *pLastPg;..  
e570: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e580: 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
e590: 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
e5a0: 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
e5b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e5d0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
e5e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
e5f0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
e600: 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
e610: 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
e620: 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
e630: 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
e640: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
e650: 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
e660: 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
e670: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e680: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
e690: 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
e6a0: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
e6b0: 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
e6c0: 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
e6d0: 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
e6e0: 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
e6f0: 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
e700: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
e710: 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
e720: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e730: 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
e740: 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
e750: 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
e760: 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
e770: 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
e780: 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
e790: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e7a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e7b0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
e7c0: 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
e7d0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e7e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e7f0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
e800: 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
e810: 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
e820: 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
e830: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
e840: 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
e850: 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
e860: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e870: 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
e880: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
e890: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e8b0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a  rn rc;.      } .
e8c0: 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
e8d0: 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
e8e0: 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
e8f0: 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b  rPage, iFreePg);
e900: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
e910: 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
e920: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e930: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e940: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
e950: 20 7d 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   } .    }.  }.. 
e960: 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69   pBt->nTrunc = i
e970: 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68  LastPg - 1;.  wh
e980: 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ile( pBt->nTrunc
e990: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
e9a0: 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50  AGE(pBt)||PTRMAP
e9b0: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
e9c0: 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20  ->nTrunc) ){.   
e9d0: 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a   pBt->nTrunc--;.
e9e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
e9f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ea00: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
ea10: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
ea20: 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
ea30: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
ea40: 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
ea50: 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
ea60: 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
ea70: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
ea80: 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
ea90: 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
eaa0: 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
eab0: 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
eac0: 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
ead0: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
eae0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
eaf0: 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
eb00: 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
eb10: 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  ccured,.** SQLIT
eb20: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
eb30: 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
eb40: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
eb50: 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
eb60: 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
eb70: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
eb80: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
eb90: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
eba0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
ebb0: 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
ebc0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
ebd0: 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
ebe0: 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
ebf0: 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75  cuum ){.    retu
ec00: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
ec10: 20 20 7d 0a 20 20 69 6e 76 61 6c 69 64 61 74 65    }.  invalidate
ec20: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
ec30: 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pBt);.  return 
ec40: 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
ec50: 42 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Bt, 0);.}../*.**
ec60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ec70: 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
ec80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
ec90: 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
eca0: 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
ecb0: 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
ecc0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
ecd0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
ece0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
ecf0: 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
ed00: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
ed10: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
ed20: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
ed30: 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
ed40: 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
ed50: 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
ed60: 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
ed70: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
ed80: 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
ed90: 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
eda0: 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
edb0: 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
edc0: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
edd0: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
ede0: 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
edf0: 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e  Bt, Pgno *pnTrun
ee00: 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
ee10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
ee20: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
ee30: 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64 65 66  >pPager;.#ifndef
ee40: 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52   NDEBUG.  int nR
ee50: 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
ee60: 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
ee70: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 76  );.#endif..  inv
ee80: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
ee90: 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
eea0: 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
eeb0: 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
eec0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
eed0: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
eee0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
eef0: 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b  Bt->nTrunc==0 ){
ef00: 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  .      Pgno nFre
ef10: 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  e;.      Pgno nP
ef20: 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e  trmap;.      con
ef30: 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
ef40: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
ef50: 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
ef60: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
ef70: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
ef80: 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50  r);..      if( P
ef90: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
efa0: 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20  , nOrig) ){.    
efb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
efc0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
efd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
efe0: 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  ( nOrig==PENDING
eff0: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
f000: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67  ){.        nOrig
f010: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
f020: 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
f030: 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
f040: 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
f050: 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
f060: 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
f070: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
f080: 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73  ig)+pgsz/5)/(pgs
f090: 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e  z/5);.      nFin
f0a0: 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
f0b0: 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20   - nPtrmap;.    
f0c0: 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
f0d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
f0e0: 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44  t) && nFin<=PEND
f0f0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
f100: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46  t) ){.        nF
f110: 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  in--;.      }.  
f120: 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
f130: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
f140: 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
f150: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
f160: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
f170: 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Fin--;.      }. 
f180: 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28     }..    while(
f190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f1a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
f1b0: 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
f1c0: 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   nFin);.    }.  
f1d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f1e0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61  _DONE ){.      a
f1f0: 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c  ssert(nFin==0 ||
f200: 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20   pBt->nTrunc==0 
f210: 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54  || nFin<=pBt->nT
f220: 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20  runc);.      rc 
f230: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f240: 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
f250: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nc ){.        sq
f260: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
f270: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
f280: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
f290: 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
f2a0: 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
f2b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74   0);.        put
f2c0: 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
f2d0: 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
f2e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
f2f0: 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20  nTrunc = nFin;. 
f300: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f310: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f320: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
f330: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
f340: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
f350: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
f360: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f370: 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e  *pnTrunc = pBt->
f380: 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d  nTrunc;.    pBt-
f390: 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d  >nTrunc = 0;.  }
f3a0: 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
f3b0: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
f3c0: 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
f3d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f3e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
f3f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
f400: 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
f410: 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
f420: 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
f430: 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
f440: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
f450: 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
f460: 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
f470: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
f480: 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
f490: 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
f4a0: 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
f4b0: 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
f4c0: 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
f4d0: 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
f4e0: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
f4f0: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
f500: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
f510: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
f520: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
f530: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f540: 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
f550: 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
f560: 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
f570: 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
f580: 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
f590: 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
f5a0: 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
f5b0: 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
f5c0: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
f5d0: 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
f5e0: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
f5f0: 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
f600: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
f610: 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
f620: 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
f630: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
f640: 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
f650: 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
f660: 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
f670: 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
f680: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
f690: 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
f6a0: 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
f6b0: 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
f6c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
f6d0: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
f6e0: 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
f6f0: 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
f700: 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
f710: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
f720: 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
f730: 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
f740: 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
f750: 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
f760: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
f770: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f780: 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
f790: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
f7a0: 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
f7b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
f7c0: 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
f7d0: 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
f7e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
f7f0: 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
f800: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
f810: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
f820: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
f830: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
f840: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
f850: 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
f860: 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
f870: 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
f880: 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
f890: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
f8a0: 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
f8b0: 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
f8c0: 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
f8d0: 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
f8e0: 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
f8f0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
f900: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
f910: 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
f920: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
f930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f940: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
f950: 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
f960: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
f970: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f980: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
f990: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
f9a0: 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
f9b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
f9c0: 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54  pBt;.    Pgno nT
f9d0: 72 75 6e 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  runc = 0;.#ifnde
f9e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f9f0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
fa00: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
fa10: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
fa20: 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
fa30: 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a  pBt, &nTrunc); .
fa40: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
fa50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fa60: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fa70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
fa80: 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
fa90: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
faa0: 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
fab0: 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  er, zMaster, nTr
fac0: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unc);.  }.  retu
fad0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fae0: 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
faf0: 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
fb00: 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
fb10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fb20: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
fb30: 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
fb40: 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
fb50: 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
fb60: 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75  3BtreeSync() rou
fb70: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
fb80: 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
fb90: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a  ould be invoked.
fba0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
fbb0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fbc0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
fbd0: 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e  reeSync() routin
fbe0: 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65  e did.** all the
fbf0: 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
fc00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
fc10: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
fc20: 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
fc30: 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
fc40: 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
fc50: 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
fc60: 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
fc70: 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
fc80: 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
fc90: 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 72  r truncate the r
fca0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
fcb0: 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65 73  ** (which causes
fcc0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fcd0: 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20   to commit) and 
fce0: 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
fcf0: 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
fd00: 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
fd10: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
fd20: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
fd30: 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
fd40: 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
fd50: 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
fd60: 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
fd70: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
fd80: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
fd90: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
fda0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
fdb0: 42 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  Bt;..  btreeInte
fdc0: 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
fdd0: 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
fde0: 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
fdf0: 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
fe00: 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
fe10: 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
fe20: 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
fe30: 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
fe40: 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
fe50: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
fe60: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
fe70: 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
fe80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
fe90: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
fea0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
feb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
fec0: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
fed0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
fee0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
fef0: 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
ff00: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
ff10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ff20: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff30: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
ff40: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
ff50: 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42  ANS_READ;.    pB
ff60: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
ff70: 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   }.  unlockAllTa
ff80: 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  bles(p);..  /* I
ff90: 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
ffa0: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
ffb0: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
ffc0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61  ecrement the tra
ffd0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
ffe0: 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
fff0: 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
10000 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
10010 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  t reaches 0, set
10020 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64  .  ** the shared
10030 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
10040 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
10050 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20  BtreeIfUnused() 
10060 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20  call below.  ** 
10070 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
10080 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  pager..  */.  if
10090 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
100a0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
100b0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
100c0 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
100d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
100e0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
100f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10100 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
10110 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
10120 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72  the handles curr
10130 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
10140 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
10150 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20  ONE and unlock. 
10160 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66   ** the pager if
10170 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
10180 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
10190 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
101a0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  tion..  */.  p->
101b0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
101c0 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
101d0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
101e0 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
101f0 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ity(p);.  return
10200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10210 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
10220 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
10230 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10240 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
10250 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
10260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10270 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
10280 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
10290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
102a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
102b0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
102c0 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  Two(p);.  }.  re
102d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
102e0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
102f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10300 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
10310 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
10320 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
10330 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
10340 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
10350 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
10360 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
10370 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
10380 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
10390 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
103a0 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
103b0 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
103c0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
103d0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
103e0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
103f0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
10400 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
10410 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
10420 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
10430 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
10440 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
10450 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10460 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
10470 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
10480 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
10490 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
104a0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
104b0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
104c0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
104d0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
104e0 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
104f0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
10500 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
10510 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
10520 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
10530 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
10540 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
10550 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
10560 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
10570 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
10580 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
10590 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
105a0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
105b0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
105c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
105d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
105e0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
105f0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
10600 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
10610 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10620 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10630 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
10640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
10650 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
10660 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
10670 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
10680 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
10690 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
106a0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
106b0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
106c0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
106d0 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
106e0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
106f0 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
10700 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
10710 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
10720 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
10730 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
10740 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
10750 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
10760 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
10770 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
10780 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
10790 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
107a0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
107b0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
107c0 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
107d0 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
107e0 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
107f0 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
10800 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
10810 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
10820 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
10830 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
10840 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70   pBt->pCursor->p
10850 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a  Btree->pSqlite;.
10860 20 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a        if( db ){.
10870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
10880 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
10890 64 62 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  dbes(db, 0);.   
108a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
108b0 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
108c0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c  egrity(p);.  unl
108d0 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
108e0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
108f0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
10900 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
10910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10920 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
10930 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
10940 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
10950 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
10960 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
10970 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
10980 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
10990 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
109a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
109b0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
109c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
109d0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
109e0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
109f0 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
10a00 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
10a10 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
10a20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65    ** call sqlite
10a30 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
10a40 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
10a50 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
10a60 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
10a70 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
10a80 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ly. */.    if( s
10a90 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
10aa0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
10ab0 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
10ac0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
10ad0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
10ae0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
10af0 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
10b00 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
10b10 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
10b20 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
10b30 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  AD;.  }..  if( p
10b40 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
10b50 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
10b60 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
10b70 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
10b80 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
10b90 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
10ba0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
10bb0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
10bc0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10bd0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
10be0 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72  }.  }..  p->inTr
10bf0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
10c00 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
10c10 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  = 0;.  unlockBtr
10c20 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
10c30 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
10c40 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ty(p);.  return 
10c50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
10c60 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
10c70 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  ubtransaction.  
10c80 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
10c90 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65  on can.** can be
10ca0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64   rolled back ind
10cb0 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
10cc0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
10cd0 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20  on..** You must 
10ce0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
10cf0 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74  ion before start
10d00 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
10d10 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62  tion..** The sub
10d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
10d30 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
10d40 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ly if the main t
10d50 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f  ransaction.** co
10d60 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
10d70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ack..**.** Only 
10d80 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  one subtransacti
10d90 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
10da0 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20   at a time.  It 
10db0 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74  is an error to t
10dc0 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61  ry.** to start a
10dd0 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74   new subtransact
10de0 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73  ion if another s
10df0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
10e00 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
10e10 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
10e20 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
10e30 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
10e40 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
10e50 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
10e60 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
10e70 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
10e80 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
10e90 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
10ea0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
10eb0 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
10ec0 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
10ed0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
10ee0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
10ef0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
10f00 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
10f10 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
10f20 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
10f30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10f40 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
10f50 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
10f60 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
10f70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
10f80 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  f( (p->inTrans!=
10f90 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
10fa0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
10fb0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
10fc0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
10fd0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
10fe0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
10ff0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
11000 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
11010 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 72 63 20  S_WRITE );.  rc 
11020 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
11030 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
11040 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
11050 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29  gin(pBt->pPager)
11060 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
11070 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
11080 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ;.}.../*.** Comm
11090 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20  it the statment 
110a0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
110b0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
110c0 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20  ress.  If no.** 
110d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
110e0 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20 69  s active, this i
110f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
11100 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
11110 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a  mmitStmt(Btree *
11120 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
11130 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11140 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
11150 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
11160 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
11170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
11180 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
11190 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d  Bt->pPager);.  }
111a0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
111b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
111c0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
111d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
111e0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
111f0 74 68 65 20 61 63 74 69 76 65 20 73 74 61 74 65  the active state
11200 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
11210 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74  ion.  If no subt
11220 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
11230 20 61 63 74 69 76 65 20 74 68 69 73 20 72 6f 75   active this rou
11240 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
11250 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  .**.** All curso
11260 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
11270 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 6f  idated by this o
11280 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
11290 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65  ttempt.** to use
112a0 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 77   a cursor that w
112b0 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
112c0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
112d0 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69   operation.** wi
112e0 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
112f0 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  error..*/.int sq
11300 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
11310 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  ckStmt(Btree *p)
11320 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11330 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
11340 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11350 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ;.  sqlite3Mallo
11360 63 44 69 73 61 6c 6c 6f 77 28 29 3b 0a 20 20 69  cDisallow();.  i
11370 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26  f( pBt->inStmt &
11380 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
11390 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
113a0 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
113b0 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
113c0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
113d0 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
113e0 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
113f0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
11400 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4d  ;.  }.  sqlite3M
11410 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 3b 0a 20 20  allocAllow();.  
11420 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11430 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20  .** Default key 
11440 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
11450 69 6f 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69  ion to be used i
11460 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  f no comparison 
11470 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  function.** is s
11480 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20  pecified on the 
11490 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
114a0 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  or() call..*/.st
114b0 61 74 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d  atic int dfltCom
114c0 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  pare(.  void *No
114d0 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 20 20  tUsed,          
114e0 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20     /* User data 
114f0 69 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  is not used */. 
11500 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76   int n1, const v
11510 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46  oid *p1,    /* F
11520 69 72 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70  irst key to comp
11530 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c  are */.  int n2,
11540 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20   const void *p2 
11550 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65      /* Second ke
11560 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
11570 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20  ){.  int c;.  c 
11580 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c  = memcmp(p1, p2,
11590 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32   n1<n2 ? n1 : n2
115a0 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  );.  if( c==0 ){
115b0 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32  .    c = n1 - n2
115c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
115d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
115e0 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
115f0 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
11600 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
11610 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
11620 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63  .  The act of ac
11630 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72  quiring a cursor
11640 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63   gets a read loc
11650 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74  k on .** the dat
11660 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
11670 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
11680 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
11690 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
116a0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
116b0 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
116c0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
116d0 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
116e0 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
116f0 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
11700 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
11710 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
11720 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
11730 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
11740 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
11750 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
11760 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
11770 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
11780 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
11790 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
117a0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
117b0 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
117c0 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
117d0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
117e0 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
117f0 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
11800 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
11810 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
11820 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
11830 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
11840 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
11850 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
11860 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
11870 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
11880 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
11890 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
118a0 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
118b0 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
118c0 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
118d0 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
118e0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
118f0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
11900 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
11910 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
11920 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
11930 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
11940 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
11950 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
11960 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
11970 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
11980 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
11990 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
119a0 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
119b0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
119c0 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
119d0 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
119e0 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
119f0 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
11a00 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
11a10 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69  *.** The compari
11a20 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  son function mus
11a30 74 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74  t be logically t
11a40 68 65 20 73 61 6d 65 20 66 6f 72 20 65 76 65 72  he same for ever
11a50 79 20 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61  y cursor.** on a
11a60 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
11a70 65 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  e.  Changing the
11a80 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
11a90 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
11aa0 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72 72 65 63 74  .** in incorrect
11ab0 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 66   operations.  If
11ac0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
11ad0 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
11ae0 2c 20 61 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63  , a.** default c
11af0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
11b00 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68 65  on is used.  The
11b10 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
11b20 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79  tion is.** alway
11b30 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e  s ignored for IN
11b40 54 4b 45 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  TKEY tables..*/.
11b50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11b60 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
11b70 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
11ba0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
11bb0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bd0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
11be0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
11bf0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
11c00 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
11c30 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
11c40 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76  .  int (*xCmp)(v
11c50 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
11c60 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
11c70 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f  oid*), /* Key Co
11c80 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f  mparison func */
11c90 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20  .  void *pArg,  
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11cc0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
11cd0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
11ce0 74 43 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20  tCursor **ppCur 
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
11d10 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
11d20 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
11d30 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
11d40 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64  pCur;.  BtShared
11d50 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11d60 0a 20 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20  .  *ppCur = 0;. 
11d70 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
11d80 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
11d90 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65  Only ){.      re
11da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11db0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
11dc0 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
11dd0 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29  ks(p, iTable, 0)
11de0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11df0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
11e00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
11e10 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
11e20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  ){.    rc = lock
11e30 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
11e40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11e70 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
11e80 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c  readOnly && wrFl
11e90 61 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ag ){.      retu
11ea0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
11eb0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LY;.    }.  }.  
11ec0 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pCur = sqliteMal
11ed0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75  loc( sizeof(*pCu
11ee0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
11ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
11f00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11f10 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
11f20 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
11f30 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
11f40 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
11f50 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  ble;.  if( iTabl
11f60 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50  e==1 && sqlite3P
11f70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
11f80 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  t->pPager)==0 ){
11f90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11fa0 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
11fb0 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
11fc0 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
11fd0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
11fe0 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
11ff0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
12000 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
12010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12020 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
12030 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
12040 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  on;.  }..  /* No
12050 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
12060 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
12070 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
12080 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
12090 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c  .  ** variables,
120a0 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
120b0 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
120c0 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20  ed list and set 
120d0 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a  *ppCur (the.  **
120e0 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74   output argument
120f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12100 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  n)..  */.  pCur-
12110 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70  >xCompare = xCmp
12120 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f   ? xCmp : dfltCo
12130 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70  mpare;.  pCur->p
12140 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43  Arg = pArg;.  pC
12150 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
12160 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
12170 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d   wrFlag;.  pCur-
12180 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
12190 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
121a0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
121b0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
121c0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
121d0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
121e0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
121f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
12200 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72 20  VALID;.  *ppCur 
12210 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75 72  = pCur;..  retur
12220 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63 72 65  n SQLITE_OK;.cre
12230 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
12240 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75 72  tion:.  if( pCur
12250 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
12260 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
12270 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12280 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75 6e  (pCur);.  }.  un
12290 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
122a0 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  d(pBt);.  return
122b0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f   rc;.}..#if 0  /
122c0 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 2f 2a  * Not Used */./*
122d0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
122e0 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  alue of the comp
122f0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
12300 75 73 65 64 20 62 79 20 61 20 63 75 72 73 6f 72  used by a cursor
12310 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12320 33 42 74 72 65 65 53 65 74 43 6f 6d 70 61 72 65  3BtreeSetCompare
12330 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
12340 75 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ur,     /* The c
12350 75 72 73 6f 72 20 74 6f 20 77 68 6f 73 65 20 63  ursor to whose c
12360 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
12370 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 2a 2f  on is changed */
12380 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29 28 76 6f  .  int(*xCmp)(vo
12390 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
123a0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
123b0 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20 63 6f 6d  id*), /* New com
123c0 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a  parison func */.
123d0 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
123e0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
123f0 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d 70 28  rgument to xCmp(
12400 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75 72 2d 3e  ) */.){.  pCur->
12410 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70 20  xCompare = xCmp 
12420 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d  ? xCmp : dfltCom
12430 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41  pare;.  pCur->pA
12440 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 23 65 6e  rg = pArg;.}.#en
12450 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
12460 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
12470 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
12480 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12490 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
124a0 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
124b0 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
124c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
124d0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
124e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
124f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12500 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
12510 74 3b 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72  t;.  clearCursor
12520 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
12530 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
12540 76 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  v ){.    pCur->p
12550 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
12560 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  ur->pNext;.  }el
12570 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  se{.    pBt->pCu
12580 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
12590 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  xt;.  }.  if( pC
125a0 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
125b0 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
125c0 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
125d0 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  v;.  }.  release
125e0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
125f0 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  );.  unlockBtree
12600 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
12610 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
12620 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
12630 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
12640 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
12650 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12660 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72   Make a temporar
12670 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c  y cursor by fill
12680 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64  ing in the field
12690 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a  s of pTempCur..*
126a0 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * The temporary 
126b0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e  cursor is not on
126c0 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74   the cursor list
126d0 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a   for the Btree..
126e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
126f0 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f  treeGetTempCurso
12700 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
12710 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
12720 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70 79 28  pCur){.  memcpy(
12730 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20  pTempCur, pCur, 
12740 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
12750 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78    pTempCur->pNex
12760 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75  t = 0;.  pTempCu
12770 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
12780 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  if( pTempCur->pP
12790 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
127a0 65 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70  e3PagerRef(pTemp
127b0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50  Cur->pPage->pDbP
127c0 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
127d0 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70  ** Delete a temp
127e0 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63  orary cursor suc
127f0 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79  h as was made by
12800 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f   the CreateTempo
12810 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20  raryCursor().** 
12820 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a  function above..
12830 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
12840 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
12850 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
12860 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75  pCur){.  if( pCu
12870 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20  r->pPage ){.    
12880 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
12890 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70  f(pCur->pPage->p
128a0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
128b0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
128c0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  the BtCursor.inf
128d0 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  o field of the g
128e0 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73 20 76  iven cursor is v
128f0 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74 20 69  alid..** If it i
12900 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
12910 6c 69 64 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  lid, call sqlite
12920 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
12930 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
12940 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
12950 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
12960 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
12970 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
12980 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
12990 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
129a0 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
129b0 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
129c0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
129d0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
129e0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
129f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
12a00 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
12a10 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
12a20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
12a30 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
12a40 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
12a50 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
12a60 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44  else{.#ifndef ND
12a70 45 42 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66  EBUG.    CellInf
12a80 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  o info;.    mems
12a90 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
12aa0 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
12ab0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
12ac0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
12ad0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69  e, pCur->idx, &i
12ae0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
12af0 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  ( memcmp(&info, 
12b00 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
12b10 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
12b20 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
12b30 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
12b40 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
12b50 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
12b60 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
12b70 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
12b80 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
12b90 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
12ba0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
12bb0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
12bc0 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
12bd0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
12be0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
12bf0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
12c00 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
12c10 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
12c20 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
12c30 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
12c40 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
12c50 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  the key..*/.int 
12c60 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
12c70 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
12c80 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
12c90 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74  .  int rc = rest
12ca0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
12cb0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
12cc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12cd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
12ce0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
12cf0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
12d00 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
12d10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
12d20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
12d30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
12d40 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a  VALID ){.      *
12d50 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
12d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
12d70 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
12d80 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
12d90 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
12da0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12db0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
12dc0 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
12dd0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
12de0 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
12df0 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
12e00 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
12e10 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73  ints to.  Always
12e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12e30 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  K..** Failure is
12e40 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
12e50 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
12e60 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a   not currently.*
12e70 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  * pointing to an
12e80 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61   entry (which ca
12e90 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
12ea0 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
12eb0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
12ec0 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20  ty) then *pSize 
12ed0 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
12ee0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12ef0 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
12f00 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
12f10 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
12f20 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
12f30 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
12f40 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
12f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
12f70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
12f80 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
12f90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
12fa0 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
12fb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
12fc0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
12fd0 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74      /* Not point
12fe0 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65  ing at a valid e
12ff0 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a  ntry - set *pSiz
13000 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20  e to 0. */.     
13010 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
13020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
13030 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
13040 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
13050 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
13060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13080 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
13090 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
130a0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
130b0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
130c0 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
130d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
130e0 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
130f0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
13100 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
13110 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
13120 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
13130 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
13140 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
13150 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
13160 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
13170 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
13180 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
13190 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
131a0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
131b0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
131c0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
131d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
131e0 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  wise:.**.** Unle
131f0 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  ss pPgnoNext is 
13200 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20 6e  NULL, the page n
13210 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
13220 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70  t overflow .** p
13230 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
13240 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74 65  d list is writte
13250 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
13260 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a 2a   If page ovfl.**
13270 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
13280 65 20 69 6e 20 69 74 27 73 20 6c 69 6e 6b 65 64  e in it's linked
13290 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
132a0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
132b0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
132c0 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
132d0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
132e0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68  o the MemPage* h
132f0 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67  andle.** for pag
13300 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65  e ovfl. The unde
13310 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61 67  rlying pager pag
13320 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
13330 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74  requested.** wit
13340 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  h the noContent 
13350 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65  flag set, so the
13360 20 70 61 67 65 20 64 61 74 61 20 61 63 63 65 73   page data acces
13370 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69  sable via.** thi
13380 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74  s handle may not
13390 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a   be trusted..*/.
133a0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
133b0 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
133c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
133d0 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
133f0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
13400 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
13410 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
13420 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
13430 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
13440 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
13450 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
13460 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
13470 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
13480 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
13490 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
134a0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d  * One of these m
134b0 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
134c0 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 79 20   Otherwise, why 
134d0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
134e0 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on? */.  assert(
134f0 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e  ppPage || pPgnoN
13500 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ext);..  /* If p
13510 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
13520 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
13530 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
13540 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20  lled to obtain. 
13550 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72   ** a MemPage* r
13560 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e  eference only. N
13570 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73 20 72  o page-data is r
13580 65 71 75 69 72 65 64 20 69 6e 20 74 68 69 73 20  equired in this 
13590 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
135a0 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20   !pPgnoNext ){. 
135b0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
135c0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
135d0 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c  t, ovfl, ppPage,
135e0 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   1);.  }..#ifnde
135f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13600 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
13610 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
13620 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
13630 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
13640 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
13650 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
13660 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
13670 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
13680 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
13690 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
136a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
136b0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
136c0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
136d0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
136e0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
136f0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
13700 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
13710 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
13720 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
13730 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
13740 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
13750 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
13760 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
13770 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
13780 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
13790 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
137a0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
137b0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
137c0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
137d0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
137e0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
137f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
13800 65 73 73 3c 3d 73 71 6c 69 74 65 33 50 61 67 65  ess<=sqlite3Page
13810 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
13820 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
13830 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
13840 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
13850 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
13860 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13880 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13890 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54 79   }.      if( eTy
138a0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
138b0 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
138c0 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
138d0 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
138e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
138f0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78  endif..  if( nex
13900 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29  t==0 || ppPage )
13910 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
13920 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72  Page = 0;..    r
13930 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13940 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
13950 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74 21  l, &pPage, next!
13960 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  =0);.    assert(
13970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
13980 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20   pPage==0);.    
13990 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72  if( next==0 && r
139a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
139b0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
139c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
139d0 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ta);.    }..    
139e0 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
139f0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
13a00 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  age;.    }else{.
13a10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
13a20 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
13a30 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74    }.  *pPgnoNext
13a40 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75   = next;..  retu
13a50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13a60 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
13a70 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
13a80 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
13a90 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
13aa0 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
13ab0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
13ac0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
13ad0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
13ae0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
13af0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
13b00 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
13b10 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
13b20 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
13b30 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
13b40 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
13b50 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
13b60 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
13b70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
13b80 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
13b90 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
13ba0 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
13bb0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
13bc0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
13bd0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
13be0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
13bf0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
13c00 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
13c10 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
13c20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13c30 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
13c40 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
13c50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
13c60 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
13c70 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
13c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13c90 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
13ca0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
13cb0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
13cc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13cd0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
13ce0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d00 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
13d10 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
13d20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
13d30 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
13d40 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
13d50 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
13d60 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
13d70 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
13d80 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
13d90 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
13da0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
13db0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
13dc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
13dd0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
13de0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13df0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13e00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
13e10 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
13e20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
13e30 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
13e40 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
13e50 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
13e60 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
13e70 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
13e80 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
13e90 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
13ea0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13eb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13ec0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
13ed0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
13ee0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
13ef0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
13f00 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
13f10 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
13f20 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
13f30 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
13f40 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
13f50 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
13f60 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
13f70 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
13f80 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
13f90 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
13fa0 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
13fb0 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
13fc0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
13fd0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
13fe0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
13ff0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
14000 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
14010 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
14020 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
14030 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
14040 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
14050 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e  ot make a distin
14060 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65  ction between ke
14070 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49  y and data..** I
14080 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20  t just reads or 
14090 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f  writes bytes fro
140a0 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  m the payload ar
140b0 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20  ea.  Data might 
140c0 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68  .** appear on th
140d0 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62  e main page or b
140e0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
140f0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
14100 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a  flow .** pages..
14110 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
14120 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
14130 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
14140 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
14150 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
14160 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
14170 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
14180 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
14190 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
141a0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
141b0 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
141c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
141d0 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
141e0 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
141f0 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
14200 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
14210 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
14220 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
14230 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
14240 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
14250 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
14260 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
14270 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
14280 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
14290 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
142a0 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
142b0 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
142c0 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
142d0 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
142e0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
142f0 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
14300 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
14310 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
14320 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
14330 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
14340 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
14350 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
14360 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
14370 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
14380 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
14390 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
143a0 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
143b0 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
143c0 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
143d0 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
143e0 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
143f0 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
14400 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
14410 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
14420 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
14430 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
14440 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
14450 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
14460 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  nt offset,      
14470 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
14480 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
14490 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
144a0 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
144b0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
144c0 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
144d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
144e0 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
144f0 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
14500 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
14510 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20   int skipKey,   
14520 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
14530 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69  begins at data i
14540 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
14550 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20  /.  int eOp     
14560 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
14570 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
14580 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
14590 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
145a0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
145b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
145c0 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  OK;.  u32 nKey;.
145d0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
145e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
145f0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20   = pCur->pPage; 
14600 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
14610 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
14620 63 75 72 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a  cursor entry */.
14630 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14640 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
14650 70 42 74 3b 20 20 20 2f 2a 20 42 74 72 65 65 20  pBt;   /* Btree 
14660 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
14670 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
14680 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
14690 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
146a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
146b0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
146c0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
146d0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
146e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
146f0 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
14700 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
14710 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
14720 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
14730 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
14740 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
14750 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
14760 65 79 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69  ey ? 0 : pCur->i
14770 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
14780 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
14790 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b   offset += nKey;
147a0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65  .  }.  if( offse
147b0 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
147c0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b  r->info.nData ){
147d0 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
147e0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
147f0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
14800 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
14810 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
14820 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
14830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
14840 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
14850 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
14860 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
14870 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
14880 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
14890 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
148a0 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
148b0 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
148c0 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
148d0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
148e0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
148f0 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
14900 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
14910 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
14920 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
14930 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65  f, a, eOp, pPage
14940 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
14950 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
14960 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
14970 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
14980 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
14990 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
149a0 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  l;.  }..  if( rc
149b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
149c0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
149d0 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 20 3d  t int ovflSize =
149e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
149f0 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
14a00 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
14a10 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
14a20 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
14a30 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
14a40 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
14a50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
14a60 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ]);..#ifndef SQL
14a70 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
14a80 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
14a90 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
14aa0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
14ab0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
14ac0 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a  verflow[].    **
14ad0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
14ae0 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
14af0 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72  e it now. The ar
14b00 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a  ray is sized at.
14b10 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79      ** one entry
14b20 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
14b30 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  ow page in the o
14b40 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
14b50 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e  he.    ** page n
14b60 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
14b70 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
14b80 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   is stored in aO
14b90 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20  verflow[0],.    
14ba0 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ** etc. A value 
14bb0 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
14bc0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65  rflow[] array me
14bd0 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
14be0 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20  wn".    ** (the 
14bf0 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
14c00 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
14c10 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
14c20 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
14c30 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  e && !pCur->aOve
14c40 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69  rflow ){.      i
14c50 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
14c60 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
14c70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
14c80 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
14c90 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43  flSize;.      pC
14ca0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
14cb0 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 4d 61  (Pgno *)sqliteMa
14cc0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 67 6e 6f  lloc(sizeof(Pgno
14cd0 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  )*nOvfl);.      
14ce0 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43  if( nOvfl && !pC
14cf0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
14d00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14d10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14d20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
14d30 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
14d40 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
14d50 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
14d60 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
14d70 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
14d80 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
14d90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
14da0 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
14db0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
14dc0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
14dd0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
14de0 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
14df0 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
14e00 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
14e10 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
14e20 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
14e30 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
14e40 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
14e50 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
14e60 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
14e70 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ze);.    }.#endi
14e80 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  f..    for( ; rc
14e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
14ea0 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
14eb0 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e  ; iIdx++){..#ifn
14ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14ed0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f  INCRBLOB.      /
14ee0 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
14ef0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
14f00 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
14f10 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
14f20 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
14f30 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ow ){.        as
14f40 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
14f50 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
14f60 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
14f70 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
14f80 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
14f90 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
14fa0 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
14fb0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
14fc0 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
14fd0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
14fe0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
14ff0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
15000 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
15010 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
15020 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
15030 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
15040 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
15050 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
15060 09 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20  .** data is not 
15070 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
15080 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
15090 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 09 2a   the overflow..*
150a0 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
150b0 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
150c0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
150d0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
150e0 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
150f0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
15100 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15110 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
15120 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
15130 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
15140 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
15150 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
15160 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
15170 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
15180 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
15190 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
151a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
151b0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
151c0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
151d0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
151e0 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53      assert(rc==S
151f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 65 78 74  QLITE_OK || next
15200 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 20 20  Page==0);.      
15210 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
15220 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
15230 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
15240 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
15250 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
15260 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
15270 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
15280 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
15290 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
152a0 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
152b0 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
152c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
152d0 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
152e0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  age;.        int
152f0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
15300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15310 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
15320 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
15330 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
15340 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15350 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15360 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
15370 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
15380 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
15390 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
153a0 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
153b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
153c0 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
153d0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
153e0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
153f0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
15400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15410 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
15420 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
15430 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
15440 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
15450 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15460 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
15470 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
15480 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
15490 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
154a0 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b            pBuf +
154b0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = a;.        }. 
154c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
154d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
154e0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
154f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15500 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
15510 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
15520 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
15530 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
15540 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15550 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
15560 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
15570 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
15580 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
15590 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
155a0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
155b0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
155c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
155d0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
155e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
155f0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
15600 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
15610 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
15620 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
15630 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
15640 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
15650 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
15660 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
15670 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
15680 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
15690 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
156a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74  .  int rc = rest
156b0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
156c0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
156d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
156e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
156f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
15700 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
15710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
15720 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
15730 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61     if( pCur->pPa
15740 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
15750 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15760 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
15770 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15780 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
15790 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  ntKey==0 );.    
157a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
157b0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
157c0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
157d0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
157e0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
157f0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
15800 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
15810 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
15820 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15830 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
15840 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
15850 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
15860 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
15870 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
15880 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
15890 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
158a0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
158b0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
158c0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
158d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
158e0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
158f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
15900 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
15910 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
15920 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
15930 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
15940 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
15950 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
15960 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
15970 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
15980 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
15990 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
159a0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
159b0 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f    int rc = resto
159c0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
159d0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
159e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
159f0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
15a00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
15a10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
15a20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
15a30 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
15a40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
15a50 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
15a60 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
15a70 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
15a80 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
15a90 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
15aa0 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b  mt, pBuf, 1, 0);
15ab0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15ad0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
15ae0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
15af0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
15b00 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
15b10 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
15b20 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
15b30 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
15b40 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
15b50 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
15b60 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
15b70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
15b80 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
15b90 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
15ba0 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
15bb0 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
15bc0 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
15bd0 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
15be0 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
15bf0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
15c00 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
15c10 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
15c20 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
15c30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15c40 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
15c50 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
15c60 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
15c70 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
15c80 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
15c90 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
15ca0 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
15cb0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
15cc0 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
15cd0 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
15ce0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
15cf0 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
15d00 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
15d10 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
15d20 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
15d30 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
15d40 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
15d50 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
15d60 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
15d70 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
15d80 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65  eassembly.** the
15d90 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
15da0 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
15db0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
15dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
15dd0 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
15de0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
15df0 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
15e00 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
15e10 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
15e20 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
15e30 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
15e40 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
15e50 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
15e60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
15e80 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
15e90 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
15ea0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
15eb0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
15ec0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
15ed0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
15ee0 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
15ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
15f00 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
15f10 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
15f20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
15f30 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
15f40 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
15f50 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
15f60 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
15f70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15f80 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
15f90 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
15fa0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
15fb0 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
15fc0 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
15fd0 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
15fe0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
15ff0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
16000 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  ID );.  pPage = 
16010 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
16020 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
16030 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
16040 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
16050 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
16060 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
16070 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
16080 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
16090 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
160a0 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
160b0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
160c0 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
160d0 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
160e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
160f0 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
16100 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
16110 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
16120 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
16130 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
16140 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
16150 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
16160 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
16170 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
16180 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
16190 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
161a0 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
161b0 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
161c0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
161d0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
161e0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
161f0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
16200 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
16210 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
16220 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
16230 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
16240 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
16250 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
16260 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
16270 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
16280 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
16290 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
162a0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
162b0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
162c0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
162d0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
162e0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
162f0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2e  y Btree routine.
16300 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
16310 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
16320 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
16330 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
16340 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
16350 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
16360 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
16370 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
16380 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
16390 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
163a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
163b0 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20  t *pAmt){.  if( 
163c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
163d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
163e0 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
163f0 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
16400 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
16410 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16420 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  0;.}.const void 
16430 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
16440 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
16450 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
16460 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
16470 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
16480 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
16490 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
164a0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
164b0 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
164c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
164d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
164e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
164f0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
16500 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
16510 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
16520 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
16530 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
16540 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
16550 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
16560 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
16570 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
16580 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
16590 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
165a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64  .  MemPage *pOld
165b0 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
165c0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
165d0 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  tree->pBt;..  as
165e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
165f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
16600 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
16610 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
16620 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
16630 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
16640 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
16650 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67  rn rc;.  pNewPag
16660 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70  e->idxParent = p
16670 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64  Cur->idx;.  pOld
16680 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
16690 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e  ge;.  pOldPage->
166a0 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
166b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64  releasePage(pOld
166c0 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
166d0 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b  Page = pNewPage;
166e0 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
166f0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
16700 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
16710 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
16720 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
16730 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
16740 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
16750 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16760 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
16770 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
16780 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
16790 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
167a0 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
167b0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
167c0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
167d0 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
167e0 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
167f0 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
16800 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
16810 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
16820 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
16830 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
16840 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
16850 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
16860 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
16870 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
16880 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
16890 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
168a0 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
168b0 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
168c0 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
168d0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
168e0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
168f0 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
16900 50 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50  Parent;.  if( pP
16910 61 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  arent==0 ) retur
16920 6e 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65  n 1;.  if( pPare
16930 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74  nt->pgno>1 ) ret
16940 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74  urn 0;.  if( get
16950 32 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  2byte(&pParent->
16960 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
16970 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20  drOffset+3])==0 
16980 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
16990 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
169a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
169b0 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
169c0 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
169d0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
169e0 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
169f0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
16a00 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
16a10 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
16a20 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
16a30 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
16a40 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
16a50 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
16a60 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
16a70 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
16a80 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
16a90 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
16aa0 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
16ab0 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
16ac0 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
16ad0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
16ae0 2a 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50  *pParent;.  MemP
16af0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  age *pPage;.  in
16b00 74 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20  t idxParent;..  
16b10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
16b20 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
16b30 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  ID );.  pPage = 
16b40 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
16b50 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
16b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  );.  assert( !sq
16b70 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
16b80 50 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20  Page(pPage) );. 
16b90 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65   pParent = pPage
16ba0 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73  ->pParent;.  ass
16bb0 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20  ert( pParent!=0 
16bc0 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d  );.  idxParent =
16bd0 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
16be0 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
16bf0 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
16c00 62 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  bPage);.  releas
16c10 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
16c20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50  pCur->pPage = pP
16c30 61 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69  arent;.  pCur->i
16c40 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
16c50 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
16c60 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b  ->idxShift==0 );
16c70 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69  .  pCur->idx = i
16c80 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  dxParent;.}../*.
16c90 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
16ca0 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  or to the root p
16cb0 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  age.*/.static in
16cc0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
16cd0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
16ce0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
16cf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16d00 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
16d10 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
16d20 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 69 66  tree->pBt;..  if
16d30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
16d40 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
16d50 45 4b 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 43  EK ){.    clearC
16d60 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
16d70 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  ur);.  }.  pRoot
16d80 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
16d90 20 20 69 66 28 20 70 52 6f 6f 74 20 26 26 20 70    if( pRoot && p
16da0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
16db0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  ->pgnoRoot ){.  
16dc0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
16dd0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c  >isInit );.  }el
16de0 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20  se{.    if( .   
16df0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
16e00 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
16e10 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
16e20 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
16e30 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0)).    ){.     
16e40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
16e50 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
16e60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16e70 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
16e80 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
16e90 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ge);.    pCur->p
16ea0 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20  Page = pRoot;.  
16eb0 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  }.  pCur->idx = 
16ec0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
16ed0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
16ee0 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
16ef0 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
16f00 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
16f10 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74  page;.    assert
16f20 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pRoot->pgno==1
16f30 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20   );.    subpage 
16f40 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
16f50 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
16f60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
16f70 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70 61     assert( subpa
16f80 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72  ge>0 );.    pCur
16f90 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
16fa0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
16fb0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
16fc0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
16fd0 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
16fe0 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65   = ((pCur->pPage
16ff0 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
17000 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
17010 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72  NVALID);.  retur
17020 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
17030 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
17040 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
17050 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
17060 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
17070 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
17080 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
17090 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
170a0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
170b0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
170c0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
170d0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
170e0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
170f0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
17100 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
17110 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
17120 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
17130 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
17140 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
17150 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
17160 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
17170 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
17180 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
17190 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
171a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
171b0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
171c0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
171d0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
171e0 65 74 34 62 79 74 65 28 73 71 6c 69 74 65 33 42  et4byte(sqlite3B
171f0 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70 50 61  treeFindCell(pPa
17200 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b  ge, pCur->idx));
17210 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
17220 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
17230 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
17240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
17250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17260 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  K;.}../*.** Move
17270 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
17280 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
17290 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
172a0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
172b0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
172c0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
172d0 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
172e0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
172f0 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
17300 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
17310 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
17320 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
17330 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
17340 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
17350 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
17360 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
17370 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
17380 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
17390 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
173a0 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
173b0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
173c0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
173d0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
173e0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
173f0 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
17400 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
17410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
17420 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
17430 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
17440 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
17450 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
17460 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
17470 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17480 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
17490 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65    while( !(pPage
174a0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
174b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
174c0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
174d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
174e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
174f0 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
17500 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
17510 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
17520 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
17530 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
17540 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
17550 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65  Cur->idx = pPage
17560 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70  ->nCell - 1;.  p
17570 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
17580 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
17590 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
175a0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
175b0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
175c0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
175d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
175e0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
175f0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
17600 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
17610 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
17620 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
17630 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
17640 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
17650 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
17660 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
17670 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
17680 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
17690 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f  nt rc;.  rc = mo
176a0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
176b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
176c0 6e 20 72 63 3b 0a 20 20 69 66 28 20 70 43 75 72  n rc;.  if( pCur
176d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
176e0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
176f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
17700 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
17710 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
17720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17730 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
17740 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
17750 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70  >nCell>0 );.  *p
17760 52 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  Res = 0;.  rc = 
17770 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
17780 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
17790 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
177a0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
177b0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
177c0 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
177d0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
177e0 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
177f0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
17800 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
17810 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
17820 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
17830 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
17840 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
17850 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17860 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
17870 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
17880 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
17890 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
178a0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
178b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
178c0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
178d0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
178e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
178f0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
17900 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
17910 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
17920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17930 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
17940 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
17950 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65  _VALID );.  *pRe
17960 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f  s = 0;.  rc = mo
17970 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
17980 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
17990 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
179a0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
179b0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
179c0 65 6e 74 72 79 20 6e 65 61 72 20 70 4b 65 79 2f  entry near pKey/
179d0 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  nKey..** Return 
179e0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
179f0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
17a00 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68   tables, only th
17a10 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72  e nKey parameter
17a20 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
17a30 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
17a40 46 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73  For other tables
17a50 2c 20 6e 4b 65 79 20 69 73 20 74 68 65 20 6e 75  , nKey is the nu
17a60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
17a70 20 64 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79   data.** in pKey
17a80 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  .  The compariso
17a90 6e 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69  n function speci
17aa0 66 69 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  fied when the cu
17ab0 72 73 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65 61  rsor was.** crea
17ac0 74 65 64 20 69 73 20 75 73 65 64 20 74 6f 20 63  ted is used to c
17ad0 6f 6d 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a  ompare keys..**.
17ae0 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
17af0 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
17b00 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
17b10 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
17b20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
17b30 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
17b40 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
17b50 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
17b60 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
17b70 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
17b80 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
17b90 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
17ba0 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
17bb0 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
17bc0 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  The result of co
17bd0 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
17be0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
17bf0 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63  o which the.** c
17c00 75 72 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e  ursor is written
17c10 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65   to *pRes if pRe
17c20 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65  s!=NULL.  The me
17c30 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73  aning of.** this
17c40 20 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c   value is as fol
17c50 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
17c60 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
17c70 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
17c80 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
17c90 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
17cb0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b   smaller than pK
17cc0 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
17cd0 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
17d00 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
17d10 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
17d20 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
17d30 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
17d40 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
17d50 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
17d60 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
17d70 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
17d80 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e  ly matches pKey.
17d90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
17da0 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
17db0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
17dc0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
17dd0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
17de0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
17df0 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f  er than pKey..*/
17e00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17e10 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
17e20 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
17e30 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
17e40 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
17e50 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
17e60 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b  y,      /* The k
17e70 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69  ey content for i
17e80 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20 75 73 65  ndices.  Not use
17e90 64 20 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  d by tables */. 
17ea0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
17eb0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
17ec0 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68 65  of pKey.  Or the
17ed0 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 20   key for tables 
17ee0 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
17ef0 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ht,         /* I
17f00 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
17f10 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
17f20 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
17f30 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
17f40 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72 65      /* Search re
17f50 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a  sult flag */.){.
17f60 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
17f70 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
17f80 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
17f90 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
17fa0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
17fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
17fc0 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
17fd0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
17fe0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
17ff0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
18000 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
18010 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
18020 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
18030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18040 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b  OK;.  }.  for(;;
18050 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
18060 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
18070 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
18080 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
18090 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20  >pPage;.    int 
180a0 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73  c = -1;  /* pRes
180b0 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65   return if table
180c0 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62   is empty must b
180d0 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20  e -1 */.    lwr 
180e0 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
180f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
18100 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
18110 6e 74 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d 30  ntKey && pKey==0
18120 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18130 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18140 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
18150 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b  if( biasRight ){
18160 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
18170 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73   = upr;.    }els
18180 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  e{.      pCur->i
18190 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32  dx = (upr+lwr)/2
181a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
181b0 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b  lwr<=upr ) for(;
181c0 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  ;){.      void *
181d0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
181e0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
181f0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
18200 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
18210 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
18220 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  y ){.        u8 
18230 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pCell;.        
18240 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pCell = sqlite3B
18250 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70 50 61  treeFindCell(pPa
18260 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b  ge, pCur->idx) +
18270 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
18280 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
18290 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
182a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
182b0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
182c0 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
182d0 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26  arint32(pCell, &
182e0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
182f0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
18300 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20  int(pCell, (u64 
18310 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
18320 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
18330 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey<nKey ){.     
18340 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
18350 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
18360 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a  CellKey>nKey ){.
18370 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
18380 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
18390 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
183a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
183b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
183c0 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a   int available;.
183d0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
183e0 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68   = (void *)fetch
183f0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61  Payload(pCur, &a
18400 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20  vailable, 0);.  
18410 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d        nCellKey =
18420 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
18430 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76  ;.        if( av
18440 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65  ailable>=nCellKe
18450 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
18460 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
18470 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
18480 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
18490 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
184a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
184b0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
184c0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
184d0 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  aw( nCellKey );.
184e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
184f0 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  ellKey==0 ) retu
18500 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
18510 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
18520 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
18530 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65  pCur, 0, nCellKe
18540 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c  y, (void *)pCell
18550 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
18560 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  c = pCur->xCompa
18570 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e  re(pCur->pArg, n
18580 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
18590 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
185a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
185b0 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  Free(pCellKey);.
185c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
185d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
185e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
185f0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
18600 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
18610 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
18620 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
18630 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
18640 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20   pCur->idx;.    
18650 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20        upr = lwr 
18660 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  - 1;.          b
18670 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
18680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
18690 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20  f( pRes ) *pRes 
186a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
186b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
186c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
186d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
186e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
186f0 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20  = pCur->idx+1;. 
18700 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18710 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e      upr = pCur->
18720 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
18730 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
18740 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
18750 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
18760 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77   pCur->idx = (lw
18770 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a  r+upr)/2;.    }.
18780 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
18790 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73  =upr+1 );.    as
187a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
187b0 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
187c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
187d0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
187e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
187f0 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
18800 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
18810 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
18820 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
18830 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
18840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18850 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
18860 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  e(sqlite3BtreeFi
18870 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
18880 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
18890 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
188a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
188b0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
188c0 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
188d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
188e0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
188f0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
18900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
18920 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20  ->idx = lwr;.   
18930 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
18940 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  e = 0;.    rc = 
18950 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
18960 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
18970 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
18980 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18990 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41    }.  /* NOT REA
189a0 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  CHED */.}../*.**
189b0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
189c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
189d0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
189e0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
189f0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
18a00 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
18a10 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
18a20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
18a30 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
18a40 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
18a50 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
18a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
18a70 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
18a80 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
18a90 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
18aa0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
18ab0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
18ac0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18ad0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
18ae0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
18af0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
18b00 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
18b10 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
18b20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
18b30 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
18b40 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
18b50 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
18b60 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
18b70 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
18b80 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
18b90 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
18ba0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
18bb0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
18bc0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
18bd0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
18be0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
18bf0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
18c00 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
18c10 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
18c20 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
18c30 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
18c40 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
18c50 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
18c60 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
18c70 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
18c80 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
18c90 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
18ca0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
18cb0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
18cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
18cd0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
18ce0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
18cf0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
18d00 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 72 63 20  e *pPage;..  rc 
18d10 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18d20 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18d30 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
18d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18d60 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
18d70 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  0 );.  pPage = p
18d80 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66  Cur->pPage;.  if
18d90 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
18da0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
18db0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
18dc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18dd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
18de0 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b   pCur->skip>0 ){
18df0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
18e00 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
18e10 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
18e20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18e30 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
18e40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18e50 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
18e60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c  sert( pCur->idx<
18e70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
18e80 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a  .  pCur->idx++;.
18e90 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
18ea0 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  ze = 0;.  if( pC
18eb0 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e  ur->idx>=pPage->
18ec0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
18ed0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
18ee0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
18ef0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
18f00 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
18f10 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
18f20 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
18f30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
18f40 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
18f50 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
18f60 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52  pCur);.      *pR
18f70 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
18f80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18f90 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
18fa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52   sqlite3BtreeIsR
18fb0 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
18fc0 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
18fd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
18fe0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
18ff0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
19000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19010 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
19020 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19030 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
19040 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
19050 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
19060 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
19070 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
19080 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ll );.    *pRes 
19090 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
190a0 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a  ge->leafData ){.
190b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
190c0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
190d0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
190e0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
190f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
19100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19110 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
19120 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
19130 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
19140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
19150 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
19160 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
19170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19180 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
19190 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
191a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
191b0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
191c0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
191d0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
191e0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
191f0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
19200 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
19210 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
19220 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
19230 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
19240 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
19250 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
19260 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
19270 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
19280 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
19290 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
192a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
192b0 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65   pgno;.  MemPage
192c0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 72 63 20 3d   *pPage;..  rc =
192d0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
192e0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
192f0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
19300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
19320 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
19330 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
19340 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
19350 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
19360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
19370 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30  if( pCur->skip<0
19380 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
19390 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
193a0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
193b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
193c0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
193d0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
193e0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
193f0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
19400 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
19410 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a  pCur->idx>=0 );.
19420 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
19430 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
19440 20 67 65 74 34 62 79 74 65 28 20 73 71 6c 69 74   get4byte( sqlit
19450 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28  e3BtreeFindCell(
19460 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
19470 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ) );.    rc = mo
19480 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
19490 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
194a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
194b0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
194c0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
194d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
194e0 65 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20  e( pCur->idx==0 
194f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
19500 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
19510 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
19520 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
19530 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
19540 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
19550 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
19560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19580 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
19590 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
195a0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
195b0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
195c0 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d  .    pCur->idx--
195d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
195e0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
195f0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
19600 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  ata && !pPage->l
19610 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
19620 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
19630 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
19640 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
19650 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19660 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
19670 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
19680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19690 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
196a0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
196b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
196c0 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
196d0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
196e0 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
196f0 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
19700 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
19710 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
19720 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
19730 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
19740 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
19750 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
19760 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
19770 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
19780 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
19790 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
197a0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
197b0 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
197c0 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
197d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
197e0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
197f0 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
19800 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
19810 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
19820 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
19830 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
19840 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
19850 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
19860 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
19870 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19880 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
19890 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
198a0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
198b0 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
198c0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
198d0 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c  0, then a (feebl
198e0 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  e) effort is mad
198f0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
19900 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
19910 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
19920 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
19930 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
19940 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
19950 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
19960 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
19970 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
19980 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
19990 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
199a0 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
199b0 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
199c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61  *.** If the "exa
199d0 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  ct" parameter is
199e0 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20   not 0, and the 
199f0 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72  page-number near
19a00 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e  by exists .** an
19a10 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
19a20 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
19a30 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
19a40 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54  o be returned. T
19a50 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75  his.** is only u
19a60 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
19a70 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65  um databases whe
19a80 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  n allocating a n
19a90 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ew table..*/.sta
19aa0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
19ab0 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
19ac0 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d  hared *pBt, .  M
19ad0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
19ae0 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c   .  Pgno *pPgno,
19af0 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c   .  Pgno nearby,
19b00 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20  .  u8 exact.){. 
19b10 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19b20 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
19b30 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t n;     /* Numb
19b40 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
19b50 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
19b60 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   int k;     /* N
19b70 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
19b80 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
19b90 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
19ba0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
19bb0 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
19bc0 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
19bd0 3b 0a 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  ;..  pPage1 = pB
19be0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d  t->pPage1;.  n =
19bf0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
19c00 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
19c10 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
19c20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
19c30 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
19c40 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
19c50 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
19c60 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
19c70 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
19c80 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
19c90 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
19ca0 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
19cb0 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
19cc0 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68     .    /* If th
19cd0 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65  e 'exact' parame
19ce0 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64  ter was true and
19cf0 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
19d00 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
19d10 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
19d20 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
19d30 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
19d40 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
19d50 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
19d60 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
19d70 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
19d80 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
19d90 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19da0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
19db0 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20 29  .    if( exact )
19dc0 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
19dd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19de0 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
19df0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
19e00 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
19e10 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
19e20 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
19e30 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
19e40 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19e50 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
19e60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
19e70 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
19e80 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
19e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
19ea0 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
19eb0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
19ec0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
19ed0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
19ee0 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
19ef0 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
19f00 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
19f10 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
19f20 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
19f30 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
19f40 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
19f50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19f60 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
19f70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
19f80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19f90 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
19fa0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
19fb0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
19fc0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
19fd0 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
19fe0 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
19ff0 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
1a000 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
1a010 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
1a020 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
1a030 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
1a040 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
1a050 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
1a060 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
1a070 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
1a080 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
1a090 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
1a0a0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
1a0b0 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
1a0c0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1a0d0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1a0e0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
1a0f0 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
1a100 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1a110 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1a120 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1a130 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
1a140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a150 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1a160 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
1a170 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  k, 0);.      if(
1a180 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
1a190 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1a1a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1a1b0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1a1c0 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
1a1d0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1a1e0 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
1a1f0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
1a200 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
1a210 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1a220 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
1a230 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
1a240 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
1a250 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
1a260 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
1a270 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
1a280 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
1a290 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
1a2a0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
1a2b0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
1a2c0 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
1a2d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
1a2e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a2f0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1a300 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1a310 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1a320 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1a330 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1a340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
1a350 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
1a360 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1a370 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1a380 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1a390 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1a3a0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1a3b0 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
1a3c0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1a3d0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1a3e0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1a3f0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1a400 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1a410 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a420 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ( k>pBt->usableS
1a430 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1a440 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
1a450 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
1a460 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
1a470 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1a480 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a490 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a4a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1a4b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
1a4c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a4d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1a4e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
1a4f0 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
1a500 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
1a510 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
1a520 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
1a530 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
1a540 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
1a550 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
1a560 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
1a570 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
1a580 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
1a590 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1a5a0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1a5b0 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
1a5c0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1a5d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
1a5e0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1a5f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a600 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1a610 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1a620 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1a630 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1a640 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1a650 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1a660 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
1a670 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1a680 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
1a690 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1a6a0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1a6b0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1a6c0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1a6d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1a6e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1a6f0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1a700 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1a710 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1a720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a740 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1a750 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
1a760 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1a770 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
1a780 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
1a790 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
1a7a0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
1a7b0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
1a7c0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
1a7d0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
1a7e0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
1a7f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a800 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
1a810 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
1a820 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
1a830 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1a840 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
1a850 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a860 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1a870 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
1a880 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
1a890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1a8a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1a8c0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1a8d0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
1a8e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a8f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1a900 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
1a910 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1a920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a930 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1a940 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
1a950 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1a960 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1a970 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1a980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a990 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
1a9a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1a9b0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1a9c0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1a9d0 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
1a9e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
1a9f0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1aa00 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
1aa10 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
1aa20 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
1aa30 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
1aa40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1aa50 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1aa60 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1aa70 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1aa80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1aa90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1aaa0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1aab0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1aad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1aae0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
1aaf0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1ab00 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
1ab20 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1ab30 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
1ab40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
1ab50 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
1ab60 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
1ab70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1ab80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ab90 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1aba0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1abb0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1abc0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1abd0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1abe0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1abf0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1ac00 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
1ac10 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
1ac20 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
1ac30 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73          int clos
1ac40 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
1ac50 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
1ac60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ac70 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
1ac80 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72  aData;.        r
1ac90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1aca0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1acb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1acc0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1acd0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1ace0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1acf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ad00 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
1ad10 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64          int i, d
1ad20 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
1ad30 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
1ad40 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
1ad50 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
1ad60 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
1ad70 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
1ad80 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
1ad90 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1ada0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
1adb0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
1adc0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1add0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
1ade0 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
1adf0 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
1ae00 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
1ae10 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
1ae20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1ae30 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
1ae40 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1ae50 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
1ae60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1ae70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ae80 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1ae90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
1aea0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
1aeb0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1aec0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
1aed0 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
1aee0 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
1aef0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
1af00 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
1af10 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
1af20 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65  f( *pPgno>sqlite
1af30 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1af40 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1af50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1af60 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65  ree page off the
1af70 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1af80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1af90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1afa0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1afb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1afc0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1afd0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
1afe0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
1aff0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
1b000 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
1b010 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
1b020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b030 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
1b040 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
1b050 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
1b060 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
1b070 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
1b080 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
1b090 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1b0a0 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
1b0b0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1b0c0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1b0d0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
1b0e0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  -1);.          r
1b0f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1b100 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
1b110 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  gno, ppPage, 1);
1b120 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1b130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b140 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1b150 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1b160 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e  back((*ppPage)->
1b170 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1b180 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b190 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
1b1a0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
1b1b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1b1c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b1d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b1e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
1b1f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1b200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1b210 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
1b220 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
1b230 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b240 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1b250 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
1b260 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
1b270 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
1b280 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
1b290 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
1b2a0 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
1b2b0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
1b2c0 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
1b2d0 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
1b2e0 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
1b2f0 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f  le */.    *pPgno
1b300 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1b310 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1b320 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e  ager) + 1;..#ifn
1b330 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b340 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1b350 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29  f( pBt->nTrunc )
1b360 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e  {.      /* An in
1b370 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61 6c  cr-vacuum has al
1b380 72 65 61 64 79 20 72 75 6e 20 77 69 74 68 69 6e  ready run within
1b390 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1b3a0 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20 20  n. So the.      
1b3b0 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63  ** page to alloc
1b3c0 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20  ate is not from 
1b3d0 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e 64  the physical end
1b3e0 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62 75   of the file, bu
1b3f0 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70 42  t.      ** at pB
1b400 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20  t->nTrunc. .    
1b410 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e    */.      *pPgn
1b420 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b  o = pBt->nTrunc+
1b430 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  1;.      if( *pP
1b440 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
1b450 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1b460 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b         (*pPgno)+
1b470 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1b480 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
1b490 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
1b4a0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a  AP_ISPAGE(pBt, *
1b4b0 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  pPgno) ){.      
1b4c0 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
1b4d0 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
1b4e0 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
1b4f0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
1b500 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
1b510 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
1b520 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
1b530 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
1b540 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
1b550 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
1b560 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
1b570 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
1b580 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
1b590 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
1b5a0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1b5b0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
1b5c0 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
1b5d0 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
1b5e0 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20  , *pPgno));.    
1b5f0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1b600 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1b610 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
1b620 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
1b630 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1b640 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20  >nTrunc ){.     
1b650 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a   pBt->nTrunc = *
1b660 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e  pPgno;.    }.#en
1b670 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28  dif..    assert(
1b680 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1b690 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1b6a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1b6b0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
1b6c0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
1b6d0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1b6e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1b6f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b700 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
1b710 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
1b720 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b740 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
1b750 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
1b760 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1b770 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
1b780 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
1b790 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
1b7a0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
1b7b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1b7c0 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
1b7d0 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
1b7e0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
1b7f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1b800 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  revTrunk);.  ret
1b810 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b820 20 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74   Add a page of t
1b830 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b840 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1b850 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ..**.** sqlite3P
1b860 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e  agerUnref() is N
1b870 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50  OT called for pP
1b880 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1b890 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  nt freePage(MemP
1b8a0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42  age *pPage){.  B
1b8b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b8c0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d  Page->pBt;.  Mem
1b8d0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1b8e0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e  Bt->pPage1;.  in
1b8f0 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f  t rc, n, k;..  /
1b900 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 70 61  * Prepare the pa
1b910 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a  ge for freeing *
1b920 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1b930 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
1b940 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
1b950 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1b960 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
1b970 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  .  pPage->pParen
1b980 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63  t = 0;..  /* Inc
1b990 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
1b9a0 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
1b9b0 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
1b9c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1b9d0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1b9e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1b9f0 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67  turn rc;.  n = g
1ba00 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1ba10 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
1ba20 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1ba30 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29  >aData[36], n+1)
1ba40 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1ba50 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
1ba60 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
1ba70 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
1ba80 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1ba90 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
1baa0 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
1bab0 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
1bac0 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
1bad0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
1bae0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1baf0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1bb00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1bb10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1bb20 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70  n rc;.  memset(p
1bb30 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
1bb40 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
1bb50 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  Size);.#endif..#
1bb60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bb70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1bb80 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
1bb90 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
1bba0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
1bbb0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
1bbc0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
1bbd0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1bbe0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
1bbf0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  e..  */.  if( pB
1bc00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1bc10 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1bc20 50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e  Put(pBt, pPage->
1bc30 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45  pgno, PTRMAP_FRE
1bc40 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  EPAGE, 0);.    i
1bc50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1bc60 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
1bc70 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
1bc80 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
1bc90 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1bca0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1bcb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1bcc0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1bcd0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1bce0 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65  rn rc;.    memse
1bcf0 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
1bd00 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62  0, 8);.    put4b
1bd10 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1bd20 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70  ta[32], pPage->p
1bd30 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28  gno);.    TRACE(
1bd40 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1bd50 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d  first\n", pPage-
1bd60 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
1bd70 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66  {.    /* Other f
1bd80 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61 64  ree pages alread
1bd90 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69 76  y exist.  Retriv
1bda0 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  e the first trun
1bdb0 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66  k page.    ** of
1bdc0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
1bdd0 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d  d find out how m
1bde0 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68 61  any leaves it ha
1bdf0 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  s. */.    MemPag
1be00 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72  e *pTrunk;.    r
1be10 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1be20 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  GetPage(pBt, get
1be30 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1be40 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75  Data[32]), &pTru
1be50 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
1be60 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1be70 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
1be80 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1be90 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d  4]);.    if( k>=
1bea0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1beb0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
1bec0 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66  * The trunk is f
1bed0 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70  ull.  Turn the p
1bee0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
1bef0 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20  into a new.     
1bf00 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77   ** trunk page w
1bf10 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 20 2a  ith no leaves. *
1bf20 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1bf30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1bf40 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1bf50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1bf60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1bf70 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1bf80 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70  aData, pTrunk->p
1bf90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 75 74 34  gno);.      put4
1bfa0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1bfb0 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ta[4], 0);.     
1bfc0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1bfd0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50  1->aData[32], pP
1bfe0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
1bff0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1c000 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
1c010 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
1c020 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
1c030 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
1c040 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  o, pTrunk->pgno)
1c050 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c060 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
1c070 65 77 6c 79 20 66 72 65 65 64 20 70 61 67 65 20  ewly freed page 
1c080 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65  as a leaf on the
1c090 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a   current trunk *
1c0a0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1c0b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1c0c0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1c0d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1c0e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c0f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
1c100 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
1c110 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  k+1);.        pu
1c120 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1c130 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50  aData[8+k*4], pP
1c140 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e  age->pgno);.#ifn
1c150 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
1c160 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
1c170 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1c180 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
1c190 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  bPage);.#endif. 
1c1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
1c1b0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1c1c0 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
1c1d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
1c1e0 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
1c1f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
1c200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1c210 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  runk);.  }.  ret
1c220 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c230 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
1c240 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
1c250 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
1c260 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
1c270 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
1c280 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1c290 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c2a0 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
1c2b0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1c2c0 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
1c2d0 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
1c2e0 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
1c2f0 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
1c300 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a   int ovflPageSiz
1c310 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e;..  sqlite3Btr
1c320 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
1c330 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1c340 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
1c350 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
1c360 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c370 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
1c380 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
1c390 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1c3a0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
1c3b0 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
1c3c0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
1c3d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
1c3e0 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
1c3f0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1c400 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
1c410 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
1c420 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
1c430 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
1c440 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
1c450 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
1c460 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
1c470 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
1c480 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50  fl-- ){.    MemP
1c490 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  age *pOvfl;.    
1c4a0 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  if( ovflPgno==0 
1c4b0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69  || ovflPgno>sqli
1c4c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1c4d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
1c4e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1c4f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c500 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  PT;.    }..    r
1c510 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
1c520 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
1c530 6f 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66  o, &pOvfl, (nOvf
1c540 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e  l==0)?0:&ovflPgn
1c550 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
1c560 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c570 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f  rc = freePage(pO
1c580 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vfl);.    sqlite
1c590 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
1c5a0 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
1c5b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1c5c0 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
1c5d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c5e0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
1c5f0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
1c600 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
1c610 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
1c620 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
1c630 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
1c640 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
1c650 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
1c660 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
1c670 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
1c680 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
1c690 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
1c6a0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
1c6b0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
1c6c0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
1c6d0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
1c6e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
1c6f0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
1c700 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
1c710 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
1c720 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
1c730 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
1c740 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
1c750 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
1c760 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
1c770 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
1c780 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
1c790 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
1c7a0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
1c7b0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
1c7c0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
1c7d0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
1c7e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
1c7f0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
1c800 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
1c810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c820 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1c830 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
1c840 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1c850 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
1c860 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
1c870 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
1c880 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1c890 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
1c8a0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
1c8b0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1c8c0 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
1c8d0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
1c8e0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c900 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
1c910 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
1c920 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
1c930 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c950 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
1c960 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1c970 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
1c980 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
1c990 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
1c9a0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
1c9b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
1c9c0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
1c9d0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
1c9e0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1c9f0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
1ca00 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
1ca10 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
1ca20 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1ca30 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
1ca40 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
1ca50 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
1ca60 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46  fo info;..  /* F
1ca70 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
1ca80 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
1ca90 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
1caa0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
1cab0 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
1cac0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
1cad0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
1cae0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
1caf0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
1cb00 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
1cb10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
1cb20 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
1cb30 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
1cb40 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
1cb50 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
1cb60 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71  64*)&nKey);.  sq
1cb70 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
1cb80 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
1cb90 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
1cba0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
1cbb0 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
1cbc0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
1cbd0 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
1cbe0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
1cbf0 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29  a==nData+nZero )
1cc00 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
1cc10 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
1cc20 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
1cc30 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
1cc40 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1cc50 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
1cc60 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
1cc70 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
1cc80 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
1cc90 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
1cca0 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
1ccb0 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
1ccc0 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  = nKey;.  }.  *p
1ccd0 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
1cce0 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
1ccf0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
1cd00 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
1cd10 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
1cd20 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
1cd30 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
1cd40 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
1cd50 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
1cd60 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
1cd70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cd80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1cd90 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
1cda0 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
1cdb0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
1cdc0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1cdd0 74 72 79 20 70 61 67 65 20 2a 2f 0a 23 65 6e 64  try page */.#end
1cde0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
1cdf0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1ce00 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
1ce10 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
1ce20 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
1ce30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ce40 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
1ce50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
1ce60 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
1ce70 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
1ce80 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
1ce90 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
1cea0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
1ceb0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
1cec0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
1ced0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
1cee0 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
1cef0 67 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e 74 72  ge now. The entr
1cf00 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
1cf10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 77 69  overflow page wi
1cf20 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  ll be.      ** a
1cf30 64 64 65 64 20 6c 61 74 65 72 2c 20 62 79 20 74  dded later, by t
1cf40 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
1cf50 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20 20 2a  routine..      *
1cf60 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1cf70 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 70  >autoVacuum && p
1cf80 67 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26 26 20  gnoPtrmap!=0 && 
1cf90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cfa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
1cfb0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
1cfc0 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
1cfd0 45 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50 74 72  ERFLOW2, pgnoPtr
1cfe0 6d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  map);.      }.#e
1cff0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
1d000 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
1d010 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
1d020 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
1d030 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1d040 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1d050 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
1d060 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1d070 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
1d080 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
1d090 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
1d0a0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
1d0b0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
1d0c0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
1d0d0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
1d0e0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
1d0f0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
1d100 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
1d110 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
1d120 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
1d130 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
1d140 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
1d150 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69  spaceLeft;.    i
1d160 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
1d170 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
1d180 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
1d190 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
1d1a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
1d1b0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
1d1c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d1d0 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
1d1e0 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
1d1f0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
1d200 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
1d210 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
1d220 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
1d230 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
1d240 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
1d250 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
1d260 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
1d270 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
1d280 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
1d290 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
1d2a0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
1d2b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d2c0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1d2d0 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
1d2e0 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70  pointer on the p
1d2f0 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72  age whose number
1d300 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20   is.** given in 
1d310 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1d320 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50  ent so that MemP
1d330 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64  age.pParent hold
1d340 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72  s the.** pointer
1d350 20 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72   in the third ar
1d360 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
1d370 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61  c int reparentPa
1d380 67 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ge(BtShared *pBt
1d390 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d  , Pgno pgno, Mem
1d3a0 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74  Page *pNewParent
1d3b0 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65  , int idx){.  Me
1d3c0 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20  mPage *pThis;.  
1d3d0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
1d3e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
1d3f0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
1d400 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
1d410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d420 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1d430 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62  ager!=0 );.  pDb
1d440 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
1d450 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
1d460 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1d470 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
1d480 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50     pThis = (MemP
1d490 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
1d4a0 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
1d4b0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68  ge);.    if( pTh
1d4c0 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  is->isInit ){.  
1d4d0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69      assert( pThi
1d4e0 73 2d 3e 61 44 61 74 61 3d 3d 28 73 71 6c 69 74  s->aData==(sqlit
1d4f0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
1d500 44 62 50 61 67 65 29 29 20 29 3b 0a 20 20 20 20  DbPage)) );.    
1d510 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61    if( pThis->pPa
1d520 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74  rent!=pNewParent
1d530 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1d540 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29  pThis->pParent )
1d550 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1d560 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  ef(pThis->pParen
1d570 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
1d580 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72       pThis->pPar
1d590 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74  ent = pNewParent
1d5a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d5b0 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50 61  3PagerRef(pNewPa
1d5c0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
1d5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
1d5e0 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  his->idxParent =
1d5f0 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20   idx;.    }.    
1d600 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d610 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  f(pDbPage);.  }.
1d620 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d630 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1d640 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1d650 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74  acuum ){.    ret
1d660 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42  urn ptrmapPut(pB
1d670 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  t, pgno, PTRMAP_
1d680 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e  BTREE, pNewParen
1d690 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65  t->pgno);.  }.#e
1d6a0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
1d6b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a  LITE_OK;.}..../*
1d6c0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
1d6d0 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f  Parent pointer o
1d6e0 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  f all children o
1d6f0 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74  f pPage to point
1d700 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67   back.** to pPag
1d710 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  e..**.** In othe
1d720 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65  r words, for eve
1d730 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67  ry child of pPag
1d740 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65  e, invoke repare
1d750 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d  ntPage().** to m
1d760 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 65 61  ake sure that ea
1d770 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74  ch child knows t
1d780 68 61 74 20 70 50 61 67 65 20 69 73 20 69 74 73  hat pPage is its
1d790 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54   parent..**.** T
1d7a0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
1d7b0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f   called after yo
1d7c0 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70  u memcpy() one p
1d7d0 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74  age into.** anot
1d7e0 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  her..*/.static i
1d7f0 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64  nt reparentChild
1d800 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70  Pages(MemPage *p
1d810 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Page){.  int i;.
1d820 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d830 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1d840 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d850 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
1d860 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20  ->leaf ) return 
1d870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f  SQLITE_OK;..  fo
1d880 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
1d890 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1d8a0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 73 71 6c   u8 *pCell = sql
1d8b0 69 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c  ite3BtreeFindCel
1d8c0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1d8d0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1d8e0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1d8f0 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74  reparentPage(pBt
1d900 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
1d910 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ), pPage, i);.  
1d920 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d930 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1d940 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
1d950 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1d960 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61  ){.    rc = repa
1d970 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65  rentPage(pBt, ge
1d980 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1d990 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1d9a0 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20  ffset+8]), .    
1d9b0 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20     pPage, i);.  
1d9c0 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
1d9d0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1d9e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d9f0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
1da00 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
1da10 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1da20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
1da30 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
1da40 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
1da50 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
1da60 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
1da70 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
1da80 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
1da90 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
1daa0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
1dab0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
1dac0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
1dad0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1dae0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
1daf0 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
1db00 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
1db10 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
1db20 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
1db30 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
1db40 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
1db50 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
1db60 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1db70 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1db80 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
1db90 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1dba0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
1dbb0 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
1dbc0 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
1dbd0 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
1dbe0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
1dbf0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
1dc00 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
1dc10 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
1dc20 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20  hin data[] */.. 
1dc30 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
1dc40 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
1dc50 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
1dc60 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
1dc70 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
1dc80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
1dc90 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
1dca0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
1dcb0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
1dcc0 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
1dcd0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
1dce0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
1dcf0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
1dd00 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72  te(ptr);.  asser
1dd10 74 28 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73  t( pc>10 && pc+s
1dd20 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z<=pPage->pBt->u
1dd30 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66  sableSize );.  f
1dd40 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
1dd50 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69  pc, sz);.  for(i
1dd60 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d  =idx+1; i<pPage-
1dd70 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72  >nCell; i++, ptr
1dd80 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d  +=2){.    ptr[0]
1dd90 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70   = ptr[2];.    p
1dda0 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a  tr[1] = ptr[3];.
1ddb0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
1ddc0 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
1ddd0 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
1dde0 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67  rOffset+3], pPag
1ddf0 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
1de00 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
1de10 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
1de20 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
1de30 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
1de40 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
1de50 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
1de60 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
1de70 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
1de80 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
1de90 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
1dea0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
1deb0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
1dec0 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
1ded0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
1dee0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
1def0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
1df00 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
1df10 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
1df20 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
1df30 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
1df40 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
1df50 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
1df60 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
1df70 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
1df80 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
1df90 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
1dfa0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
1dfb0 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
1dfc0 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
1dfd0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
1dfe0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
1dff0 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
1e000 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
1e010 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
1e020 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
1e030 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
1e040 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
1e050 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
1e060 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
1e070 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
1e080 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
1e090 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
1e0a0 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
1e0b0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1e0c0 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
1e0d0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1e0e0 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
1e0f0 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
1e100 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
1e110 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
1e120 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
1e130 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
1e140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1e150 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
1e160 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
1e170 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
1e180 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
1e190 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
1e1a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
1e1b0 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
1e1c0 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
1e1d0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
1e1e0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
1e1f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
1e200 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
1e210 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
1e220 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
1e230 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
1e240 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
1e250 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
1e260 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
1e270 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
1e280 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20    u8 nSkip      
1e290 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72      /* Do not wr
1e2a0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ite the first nS
1e2b0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
1e2c0 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   cell */.){.  in
1e2d0 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
1e2e0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
1e2f0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
1e300 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
1e310 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
1e320 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1e330 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ter */.  int top
1e340 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
1e350 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74  rst byte of cont
1e360 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c  ent for any cell
1e370 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
1e380 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
1e390 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
1e3a0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
1e3b0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
1e3c0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
1e3d0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
1e3e0 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
1e3f0 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
1e400 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
1e410 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  d */.  int hdr; 
1e420 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1e430 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f  et into data[] o
1e440 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
1e450 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  r */.  int cellO
1e460 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
1e470 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
1e480 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
1e490 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
1e4a0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
1e4b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1e4c0 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
1e4d0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
1e4e0 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
1e4f0 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
1e500 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
1e510 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
1e520 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
1e530 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
1e540 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
1e550 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
1e560 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
1e570 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
1e580 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1e590 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1e5a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1e5b0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
1e5c0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
1e5d0 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
1e5e0 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
1e5f0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
1e600 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
1e610 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
1e620 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
1e630 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  mp;.    }.    j 
1e640 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
1e650 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
1e660 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65  ( j<sizeof(pPage
1e670 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
1e680 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
1e690 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
1e6a0 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
1e6b0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
1e6c0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
1e6d0 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   i;.    pPage->n
1e6e0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
1e6f0 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  e{.    data = pP
1e700 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
1e710 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
1e720 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
1e730 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
1e740 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
1e750 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
1e760 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
1e770 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
1e780 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
1e790 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
1e7a0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
1e7b0 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
1e7c0 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
1e7d0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 64 65       int rc = de
1e7e0 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
1e7f0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
1e800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e810 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e820 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
1e830 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
1e840 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
1e850 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  + sz <= top );. 
1e860 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61     }.    idx = a
1e870 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
1e880 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73  ge, sz);.    ass
1e890 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20  ert( idx>0 );.  
1e8a0 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d    assert( end <=
1e8b0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
1e8c0 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70  hdr+5]) );.    p
1e8d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
1e8e0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
1e8f0 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
1e900 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
1e910 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
1e920 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
1e930 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
1e940 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
1e950 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
1e960 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
1e970 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
1e980 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
1e990 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
1e9a0 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
1e9b0 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
1e9c0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
1e9d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
1e9e0 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69     pPage->idxShi
1e9f0 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ft = 1;.#ifndef 
1ea00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ea10 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1ea20 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
1ea30 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
1ea40 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
1ea50 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
1ea60 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
1ea70 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
1ea80 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
1ea90 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
1eaa0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
1eab0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1eac0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1ead0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1eae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1eaf0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
1eb00 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1eb10 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fo);.      asser
1eb20 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
1eb30 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
1eb40 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
1eb50 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
1eb60 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44      if( (info.nD
1eb70 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
1eb80 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
1eb90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1eba0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e          Pgno pgn
1ebb0 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
1ebc0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
1ebd0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
1ebe0 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d 61    int rc = ptrma
1ebf0 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
1ec00 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
1ec10 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
1ec20 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
1ec30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ec40 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1ec50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ec60 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
1ec70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ec80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
1ec90 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
1eca0 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
1ecb0 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
1ecc0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
1ecd0 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
1ece0 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
1ecf0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
1ed00 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1ed10 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
1ed20 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
1ed30 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
1ed40 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
1ed50 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
1ed60 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1ed70 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
1ed80 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
1ed90 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
1eda0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
1edb0 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
1edc0 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20 20  /.  int *aSize  
1edd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
1ede0 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
1edf0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1ee00 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1ee10 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
1ee20 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20  otalSize;    /* 
1ee30 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Total size of al
1ee40 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74  l cells */.  int
1ee50 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
1ee60 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20  * Index of page 
1ee70 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1ee80 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a  cellptr;      /*
1ee90 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
1eea0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
1eeb0 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
1eec0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1eed0 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
1eee0 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  y */.  u8 *data;
1eef0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1ef00 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
1ef10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1ef20 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
1ef30 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d  );.  totalSize =
1ef40 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
1ef50 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1ef60 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61    totalSize += a
1ef70 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61  Size[i];.  }.  a
1ef80 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65  ssert( totalSize
1ef90 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  +2*nCell<=pPage-
1efa0 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65  >nFree );.  asse
1efb0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
1efc0 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72  ==0 );.  cellptr
1efd0 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
1efe0 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
1eff0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
1f000 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
1f010 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74  ffset;.  put2byt
1f020 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
1f030 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43  nCell);.  if( nC
1f040 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62  ell ){.    cellb
1f050 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  ody = allocateSp
1f060 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c  ace(pPage, total
1f070 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
1f080 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
1f090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f0a0 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e  ge->nFree >= 2*n
1f0b0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  Cell );.    pPag
1f0c0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43  e->nFree -= 2*nC
1f0d0 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ell;.    for(i=0
1f0e0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1f0f0 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
1f100 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20  &data[cellptr], 
1f110 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20  cellbody);.     
1f120 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
1f130 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
1f140 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
1f150 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20       cellptr += 
1f160 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64  2;.      cellbod
1f170 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y += aSize[i];. 
1f180 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1f190 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65   cellbody==pPage
1f1a0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
1f1b0 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  e );.  }.  pPage
1f1c0 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
1f1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
1f1e0 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
1f1f0 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
1f200 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
1f210 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
1f220 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
1f230 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
1f240 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
1f250 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
1f260 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
1f270 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
1f280 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
1f290 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
1f2a0 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
1f2b0 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
1f2c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1f2d0 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
1f2e0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
1f2f0 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
1f300 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
1f310 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
1f320 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
1f330 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
1f340 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
1f350 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
1f360 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
1f370 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
1f380 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
1f390 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
1f3a0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
1f3b0 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
1f3c0 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
1f3d0 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
1f3e0 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
1f3f0 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
1f400 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
1f410 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
1f420 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
1f430 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
1f440 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
1f450 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
1f460 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
1f470 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
1f480 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
1f490 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
1f4a0 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
1f4b0 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
1f4c0 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  nce */../* Forwa
1f4d0 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
1f4e0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
1f4f0 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74  ce(MemPage*, int
1f500 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1f510 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
1f520 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
1f530 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
1f540 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
1f550 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
1f560 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
1f570 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
1f580 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
1f590 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
1f5a0 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
1f5b0 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
1f5c0 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
1f5d0 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
1f5e0 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
1f5f0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
1f600 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
1f610 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61  ead of trying ba
1f620 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
1f630 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
1f640 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
1f650 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
1f660 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1f670 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
1f680 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
1f690 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
1f6a0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
1f6b0 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
1f6c0 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
1f6d0 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
1f6e0 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
1f6f0 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
1f700 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
1f710 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
1f720 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
1f730 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
1f740 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
1f750 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
1f760 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
1f770 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
1f780 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1f790 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
1f7a0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
1f7b0 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
1f7c0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
1f7d0 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
1f7e0 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
1f7f0 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
1f800 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
1f810 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
1f820 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
1f830 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
1f840 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
1f850 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70  Page, MemPage *p
1f860 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  Parent){.  int r
1f870 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  c;.  MemPage *pN
1f880 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e  ew;.  Pgno pgnoN
1f890 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ew;.  u8 *pCell;
1f8a0 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20  .  int szCell;. 
1f8b0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1f8c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f8d0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1f8e0 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20  int parentIdx = 
1f8f0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
1f900 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77    /* pParent new
1f910 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
1f920 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  dex */.  int par
1f930 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  entSize;        
1f940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1f950 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65  ze of new divide
1f960 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70  r cell */.  u8 p
1f970 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20  arentCell[64];  
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f990 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   Space for the n
1f9a0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
1f9b0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
1f9c0 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 6e  e a new page. In
1f9d0 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c 6f  sert the overflo
1f9e0 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  w cell from pPag
1f9f0 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20  e.  ** into it. 
1fa00 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20  Then remove the 
1fa10 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
1fa20 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  om pPage..  */. 
1fa30 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1fa40 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
1fa50 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
1fa60 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
1fa70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fa80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1fa90 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   pCell = pPage->
1faa0 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
1fab0 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53    szCell = cellS
1fac0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
1fad0 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  ell);.  zeroPage
1fae0 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44  (pNew, pPage->aD
1faf0 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d  ata[0]);.  assem
1fb00 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
1fb10 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
1fb20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
1fb30 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a  rflow = 0;..  /*
1fb40 20 53 65 74 20 74 68 65 20 70 61 72 65 6e 74 20   Set the parent 
1fb50 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c  of the newly all
1fb60 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f 20 70  ocated page to p
1fb70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65  Parent. */.  pNe
1fb80 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  w->pParent = pPa
1fb90 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  rent;.  sqlite3P
1fba0 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
1fbb0 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  >pDbPage);..  /*
1fbc0 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e   pPage is curren
1fbd0 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68  tly the right-ch
1fbe0 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20  ild of pParent. 
1fbf0 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a  Change this.  **
1fc00 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67   so that the rig
1fc10 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20  ht-child is the 
1fc20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74  new page allocat
1fc30 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a  ed above and.  *
1fc40 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e  * pPage is the n
1fc50 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69  ext-to-right chi
1fc60 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ld. .  */.  asse
1fc70 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
1fc80 3e 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  >0 );.  pCell = 
1fc90 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64  sqlite3BtreeFind
1fca0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
1fcb0 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73  e->nCell-1);.  s
1fcc0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
1fcd0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
1fce0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1fcf0 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
1fd00 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43  pParent, parentC
1fd10 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
1fd20 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72  y, 0, 0, 0, &par
1fd30 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  entSize);.  if( 
1fd40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fd50 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1fd60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61    }.  assert( pa
1fd70 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20  rentSize<64 );. 
1fd80 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
1fd90 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
1fda0 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  Idx, parentCell,
1fdb0 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20   parentSize, 0, 
1fdc0 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
1fdd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fde0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1fdf0 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
1fe00 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
1fe10 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
1fe20 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75  age->pgno);.  pu
1fe30 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
1fe40 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
1fe50 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
1fe60 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66  noNew);..#ifndef
1fe70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1fe80 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
1fe90 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
1fea0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
1feb0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
1fec0 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74  ter map.  ** wit
1fed0 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
1fee0 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
1fef0 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
1ff00 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20   the .  ** cell 
1ff10 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
1ff20 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
1ff30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
1ff40 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1ff50 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
1ff60 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
1ff70 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
1ff80 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
1ff90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ffa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1ffb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ffc0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
1ffd0 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20  Ovfl(pNew, 0);. 
1ffe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
20000 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20010 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
20020 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
20030 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
20040 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63   page and balanc
20050 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
20060 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  e,.  ** in case 
20070 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
20080 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64   inserted caused
20090 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76   it to become ov
200a0 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72  erfull..  */.  r
200b0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
200c0 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e  ;.  return balan
200d0 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  ce(pParent, 0);.
200e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
200f0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
20100 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ANCE */../*.** T
20110 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
20120 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20  stributes Cells 
20130 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  on pPage and up 
20140 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73  to NN*2 siblings
20150 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20  .** of pPage so 
20160 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68  that all pages h
20170 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61  ave about the sa
20180 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65  me amount of fre
20190 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61  e space..** Usua
201a0 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  lly NN siblings 
201b0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
201c0 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20  f pPage is used 
201d0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
201e0 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65  ,.** though more
201f0 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20   siblings might 
20200 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69  come from one si
20210 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74  de if pPage is t
20220 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c  he first.** or l
20230 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
20240 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61   parent.  If pPa
20250 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ge has fewer tha
20260 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a  n 2*NN siblings.
20270 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  ** (something wh
20280 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
20290 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20  pen if pPage is 
202a0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72  the root page or
202b0 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20   a .** child of 
202c0 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61  root) then all a
202d0 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67  vailable sibling
202e0 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  s participate in
202f0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
20300 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
20310 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
20320 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69  pPage might be i
20330 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72  ncreased or decr
20340 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a  eased by one or.
20350 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  ** two in an eff
20360 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
20370 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
20380 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
20390 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   The root page.*
203a0 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64  * is special and
203b0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
203c0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
203d0 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20  If pPage is .** 
203e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  the root page, t
203f0 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66  hen the depth of
20400 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20   the tree might 
20410 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20  be increased.** 
20420 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
20430 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72  one, as necessar
20440 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72  y, to keep the r
20450 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65  oot page from be
20460 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20  ing.** overfull 
20470 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  or completely em
20480 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  pty..**.** Note 
20490 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
204a0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
204b0 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65  , some of the Ce
204c0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20  lls on pPage.** 
204d0 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
204e0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
204f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20  pPage->aData[]. 
20500 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
20510 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
20520 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61  is overfull.  Pa
20530 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66  rt of the job of
20540 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20550 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65   to.** make sure
20560 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70   all Cells for p
20570 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20  Page once again 
20580 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  fit in pPage->aD
20590 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ata[]..**.** In 
205a0 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61  the course of ba
205b0 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c  lancing the sibl
205c0 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74  ings of pPage, t
205d0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
205e0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f  ge.** might beco
205f0 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
20600 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68  nderfull.  If th
20610 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e  at happens, then
20620 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
20630 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
20640 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61  sively on the pa
20650 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rent..**.** If t
20660 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
20670 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
20680 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
20690 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
206a0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
206b0 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68  state.  So if th
206c0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
206d0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
206e0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
206f0 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
20700 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
20710 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a  onroot(MemPage *
20720 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
20730 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  e *pParent;     
20740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20750 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f  rent of pPage */
20760 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20780 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
20790 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
207a0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
207b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
207c0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
207d0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
207e0 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
207f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
20800 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
20810 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
20820 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rom. */.  int nO
20830 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
20840 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20850 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
20860 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ld[] */.  int nN
20870 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
20880 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20890 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
208a0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ew[] */.  int nD
208b0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
208c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
208d0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44   of cells in apD
208e0 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  iv[] */.  int i,
208f0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
20900 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20910 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
20920 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
20930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20940 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70  ex of pPage in p
20950 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
20960 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20  */.  int nxDiv; 
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65    /* Next divide
20990 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e  r slot in pParen
209a0 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
209b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209d0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
209e0 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72  */.  int leafCor
209f0 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rection;        
20a00 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20    /* 4 if pPage 
20a10 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
20a20 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   not */.  int le
20a30 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
20a40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20a50 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
20a60 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20  f of a LEAFDATA 
20a70 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  tree */.  int us
20a80 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20  ableSpace;      
20a90 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
20aa0 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20  in pPage beyond 
20ab0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
20ac0 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20  int pageFlags;  
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ae0 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e  Value of pPage->
20af0 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e  aData[0] */.  in
20b00 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20  t subtotal;     
20b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
20b20 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20  btotal of bytes 
20b30 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20  in cells on one 
20b40 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  page */.  int iS
20b50 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
20b60 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20b70 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
20b80 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  Space[] */.  Mem
20b90 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
20ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
20bb0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
20bc0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50   siblings */.  P
20bd0 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b  gno pgnoOld[NB];
20be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
20bf0 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
20c00 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f  each page in apO
20c10 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ld[] */.  MemPag
20c20 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
20c30 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
20c40 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
20c50 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
20c60 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
20c70 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
20c80 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
20c90 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
20ca0 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
20cb0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b  Pgno pgnoNew[NB+
20cc0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
20cd0 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
20ce0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
20cf0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  New[] */.  u8 *a
20d00 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pDiv[NB];       
20d10 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
20d20 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
20d30 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
20d40 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
20d50 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
20d60 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
20d70 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
20d80 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
20d90 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
20da0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
20db0 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
20dc0 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
20dd0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
20de0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
20df0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
20e00 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
20e10 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b  /.  int *szCell;
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
20e40 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
20e50 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
20e60 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  *aCopy[NB];     
20e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
20e80 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64  ce for holding d
20e90 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20  ata of apCopy[] 
20ea0 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 3b  */.  u8 *aSpace;
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
20ed0 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  ld copies of div
20ee0 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 23  iders cells */.#
20ef0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20f00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20f10 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23  u8 *aFrom = 0;.#
20f20 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a 20 20 2a  endif..  /* .  *
20f30 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e  * Find the paren
20f40 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
20f50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
20f60 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
20f70 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
20f80 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
20f90 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70  >pDbPage) );.  p
20fa0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
20fb0 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
20fc0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  ge->pParent;.  a
20fd0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29  ssert( pParent )
20fe0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
20ff0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
21000 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
21010 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  nt->pDbPage)) ){
21020 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21030 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
21040 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
21050 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
21060 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
21070 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
21080 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
21090 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
210a0 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ANCE.  /*.  ** A
210b0 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   special case:  
210c0 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68  If a new entry h
210d0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73  as just been ins
210e0 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a  erted into a.  *
210f0 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73  * table (that is
21100 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69  , a btree with i
21110 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20  nteger keys and 
21120 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20  all data at the 
21130 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64  leaves).  ** and
21140 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
21150 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
21160 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
21170 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20  ee (it has the. 
21180 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29   ** largest key)
21190 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70   then use the sp
211a0 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75  ecial balance_qu
211b0 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ick() routine fo
211c0 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  r.  ** balancing
211d0 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  .  balance_quick
211e0 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65  () is much faste
211f0 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e  r and results in
21200 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20   a tighter.  ** 
21210 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20  packing of data 
21220 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
21230 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
21240 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20  Page->leaf &&.  
21250 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
21260 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  y &&.      pPage
21270 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20 20  ->leafData &&.  
21280 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
21290 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20  flow==1 &&.     
212a0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
212b0 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  .idx==pPage->nCe
212c0 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ll &&.      pPag
212d0 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  e->pParent->pgno
212e0 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74  !=1 &&.      get
212f0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
21300 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
21310 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50  drOffset+8])==pP
21320 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20  age->pgno.  ){. 
21330 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     /*.    ** TOD
21340 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62  O: Check the sib
21350 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66  lings to the lef
21360 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d  t of pPage. It m
21370 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a  ay be that.    *
21380 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66  * they are not f
21390 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70  ull and no new p
213a0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e  age is required.
213b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
213c0 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  rn balance_quick
213d0 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  (pPage, pParent)
213e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
213f0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
21400 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72   cell in the par
21410 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c  ent page whose l
21420 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73  eft child points
21430 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50   back.  ** to pP
21440 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22 20  age.  The "idx" 
21450 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20  variable is the 
21460 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 65  index of that ce
21470 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20  ll.  If pPage.  
21480 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74 6d  ** is the rightm
21490 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
214a0 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64  rent then set id
214b0 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43  x to pParent->nC
214c0 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ell .  */.  if( 
214d0 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66  pParent->idxShif
214e0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
214f0 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70  no;.    pgno = p
21500 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  Page->pgno;.    
21510 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71  assert( pgno==sq
21520 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
21530 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
21540 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  age) );.    for(
21550 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72 65  idx=0; idx<pPare
21560 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b  nt->nCell; idx++
21570 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65 74  ){.      if( get
21580 34 62 79 74 65 28 73 71 6c 69 74 65 33 42 74 72  4byte(sqlite3Btr
21590 65 65 46 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  eeFindCell(pPare
215a0 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20  nt, idx))==pgno 
215b0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
215c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
215d0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c      assert( idx<
215e0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20  pParent->nCell. 
215f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67              || g
21600 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
21610 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
21620 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
21630 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno );.  }else{
21640 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65  .    idx = pPage
21650 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d  ->idxParent;.  }
21660 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74  ..  /*.  ** Init
21670 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73  ialize variables
21680 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
21690 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70   be safe to jump
216a0 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74  .  ** directly t
216b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
216c0 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e  p at any moment.
216d0 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e  .  */.  nOld = n
216e0 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  New = 0;.  sqlit
216f0 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
21700 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20  nt->pDbPage);.. 
21710 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69   /*.  ** Find si
21720 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70  bling pages to p
21730 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c  Page and the cel
21740 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68  ls in pParent th
21750 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74  at divide.  ** t
21760 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e  he siblings.  An
21770 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
21780 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c   to find NN sibl
21790 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20  ings on either. 
217a0 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67   ** side of pPag
217b0 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67  e.  More sibling
217c0 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
217d0 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76   one side, howev
217e0 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67  er, if.  ** pPag
217f0 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  e there are fewe
21800 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
21810 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
21820 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e  side.  If pParen
21830 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72  t.  ** has NB or
21840 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20   fewer children 
21850 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  then all childre
21860 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65  n of pParent are
21870 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e   taken..  */.  n
21880 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b  xDiv = idx - NN;
21890 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e  .  if( nxDiv + N
218a0 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  B > pParent->nCe
218b0 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  ll ){.    nxDiv 
218c0 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
218d0 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20   - NB + 1;.  }. 
218e0 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a   if( nxDiv<0 ){.
218f0 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
21900 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20   }.  nDiv = 0;. 
21910 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69   for(i=0, k=nxDi
21920 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b  v; i<NB; i++, k+
21930 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50  +){.    if( k<pP
21940 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
21950 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
21960 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e   sqlite3BtreeFin
21970 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b  dCell(pParent, k
21980 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b  );.      nDiv++;
21990 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
219a0 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b  pParent->leaf );
219b0 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
219c0 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  ] = get4byte(apD
219d0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  iv[i]);.    }els
219e0 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74  e if( k==pParent
219f0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
21a00 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
21a10 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
21a20 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
21a30 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
21a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21a50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21a60 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
21a70 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c  Page(pBt, pgnoOl
21a80 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  d[i], &apOld[i],
21a90 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69   pParent);.    i
21aa0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
21ab0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
21ac0 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50    apOld[i]->idxP
21ad0 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61  arent = k;.    a
21ae0 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20  pCopy[i] = 0;.  
21af0 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c    assert( i==nOl
21b00 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b  d );.    nOld++;
21b10 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
21b20 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
21b30 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
21b40 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20  verflow;.  }..  
21b50 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
21b60 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
21b70 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  2 in order to pr
21b80 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
21b90 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
21ba0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
21bb0 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31  MaxCells + 1)&~1
21bc0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
21bd0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
21be0 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
21bf0 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  s.  */.  apCell 
21c00 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
21c10 77 28 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  w( .       nMaxC
21c20 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
21c50 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
21c60 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
21c70 69 6e 74 29 20 20 20 20 20 20 20 20 20 20 20 20  int)            
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c90 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
21ca0 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
21cb0 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20 20 20  (MemPage))*NB   
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cd0 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20     /* aCopy */. 
21ce0 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
21cf0 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20 20 20  ize*(5+NB)      
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d10 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20        /* aSpace 
21d20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54  */.     + (ISAUT
21d30 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65  OVACUUM ? nMaxCe
21d40 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20 20 20  lls : 0)        
21d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72            /* aFr
21d60 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  om */.  );.  if(
21d70 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
21d80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
21d90 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
21da0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
21db0 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69   }.  szCell = (i
21dc0 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  nt*)&apCell[nMax
21dd0 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
21de0 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
21df0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
21e00 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
21e10 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  0] - (u8*)apCell
21e20 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
21e30 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
21e40 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66   required */.  f
21e50 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
21e60 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
21e70 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
21e80 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
21e90 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
21ea0 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
21eb0 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
21ec0 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
21ed0 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
21ee0 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
21ef0 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
21f00 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42  pace = &aCopy[NB
21f10 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
21f20 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
21f30 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73  MemPage))];.  as
21f40 73 65 72 74 28 20 28 28 61 53 70 61 63 65 20 2d  sert( ((aSpace -
21f50 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20   (u8*)apCell) & 
21f60 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
21f70 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
21f80 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66  uired */.#ifndef
21f90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21fa0 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
21fb0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
21fc0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
21fd0 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65  pace[5*pBt->page
21fe0 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  Size];.  }.#endi
21ff0 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  f.  .  /*.  ** M
22000 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
22010 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
22020 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
22030 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
22040 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
22050 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
22060 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
22070 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
22080 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
22090 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
220a0 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
220b0 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
220c0 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
220d0 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
220e0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
220f0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
22100 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
22110 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
22120 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
22130 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d  *)&aCopy[i][pBt-
22140 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20  >pageSize];.    
22150 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38  p->aData = &((u8
22160 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  *)p)[-pBt->pageS
22170 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ize];.    memcpy
22180 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  (p->aData, apOld
22190 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
221a0 3e 70 61 67 65 53 69 7a 65 20 2b 20 73 69 7a 65  >pageSize + size
221b0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
221c0 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28    /* The memcpy(
221d0 29 20 61 62 6f 76 65 20 63 68 61 6e 67 65 73 20  ) above changes 
221e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
221f0 61 44 61 74 61 20 73 6f 20 77 65 20 68 61 76 65  aData so we have
22200 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 74 20 69   to.    ** set i
22210 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  t again. */.    
22220 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38  p->aData = &((u8
22230 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  *)p)[-pBt->pageS
22240 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ize];.  }..  /*.
22250 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
22260 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
22270 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
22280 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
22290 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
222a0 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
222b0 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
222c0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
222d0 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
222e0 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
222f0 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63  ained form aSpac
22300 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  e[] and remove t
22310 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43  he the divider C
22320 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
22330 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
22340 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
22350 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
22360 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
22370 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
22380 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
22390 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
223a0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
223b0 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
223c0 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
223d0 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20 20 49  nto aSpace[].  I
223e0 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
223f0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
22400 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
22410 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
22420 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
22430 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
22440 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
22450 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
22460 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
22470 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
22480 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
22490 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
224a0 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
224b0 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
224c0 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
224d0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
224e0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
224f0 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
22500 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
22510 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
22520 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
22530 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
22540 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20  s..  */.  nCell 
22550 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65  = 0;.  leafCorre
22560 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c  ction = pPage->l
22570 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
22580 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  a = pPage->leafD
22590 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  ata && pPage->le
225a0 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  af;.  for(i=0; i
225b0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
225c0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
225d0 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20   apCopy[i];.    
225e0 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64  int limit = pOld
225f0 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
22600 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72  verflow;.    for
22610 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
22620 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
22630 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
22640 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65  ls );.      apCe
22650 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
22660 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
22670 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43  d, j);.      szC
22680 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
22690 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
226a0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23  pCell[nCell]);.#
226b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
226c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
226d0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
226e0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
226f0 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20     int a;.      
22700 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
22710 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
22720 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76  a=0; a<pOld->nOv
22730 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20  erflow; a++){.  
22740 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
22750 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c  ->aOvfl[a].pCell
22760 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  ==apCell[nCell] 
22770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
22780 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
22790 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF;.            
227a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
227b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
227c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
227d0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
227e0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
227f0 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  1 ){.      int s
22800 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
22810 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
22820 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
22830 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
22840 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45    /* With the LE
22850 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61  AFDATA flag, pPa
22860 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20  rent cells hold 
22870 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61  only INTKEYs tha
22880 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  t.        ** are
22890 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b   duplicates of k
228a0 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  eys on the child
228b0 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64   pages.  We need
228c0 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20   to remove.     
228d0 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65     ** the divide
228e0 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61  r cells from pPa
228f0 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69  rent, but the di
22900 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65  viders cells are
22910 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
22920 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b  added to apCell[
22930 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  ] because they a
22940 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
22950 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20   child cells..  
22960 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22970 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
22980 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
22990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
229a0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
229b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
229c0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
229d0 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
229e0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
229f0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
22a00 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20  Space[iSpace];. 
22a10 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d         iSpace +=
22a20 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
22a30 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74  ert( iSpace<=pBt
22a40 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a  ->pageSize*5 );.
22a50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
22a60 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Temp, apDiv[i], 
22a70 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  sz);.        apC
22a80 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
22a90 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
22aa0 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n;.#ifndef SQLIT
22ab0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
22ac0 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  M.        if( pB
22ad0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
22ae0 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d  .          aFrom
22af0 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
22b00 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
22b10 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
22b20 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
22b30 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73  , sz);.        s
22b40 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20  zCell[nCell] -= 
22b50 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
22b60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22b70 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d  get4byte(pTemp)=
22b80 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20  =pgnoOld[i] );. 
22b90 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64         if( !pOld
22ba0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
22bb0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
22bc0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
22bd0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
22be0 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
22bf0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
22c00 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
22c10 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
22c20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
22c30 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
22c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
22c50 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
22c60 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
22c70 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  [pOld->hdrOffset
22c80 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  +8], 4);.       
22c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22ca0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
22cb0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
22cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22cd0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
22ce0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
22cf0 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
22d00 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
22d10 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
22d20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
22d30 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
22d40 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
22d50 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
22d60 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
22d70 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
22d80 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
22d90 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
22da0 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
22db0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
22dc0 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
22dd0 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
22de0 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
22df0 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
22e00 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
22e10 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
22e20 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
22e30 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
22e40 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
22e50 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
22e60 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
22e70 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
22e80 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
22e90 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
22ea0 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
22eb0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
22ec0 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
22ed0 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
22ee0 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
22ef0 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
22f00 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
22f20 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
22f30 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
22f40 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
22f50 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
22f60 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
22f70 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
22f80 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
22f90 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
22fa0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
22fb0 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
22fc0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
22fd0 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
22fe0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
22ff0 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
23000 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
23010 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
23020 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
23030 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
23040 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
23050 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
23060 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
23070 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
23080 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
23090 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
230a0 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
230b0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
230c0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  +;.    }.  }.  s
230d0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
230e0 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
230f0 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
23100 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
23110 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
23120 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
23130 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
23140 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
23150 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
23160 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
23170 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
23180 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
23190 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
231a0 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
231b0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
231c0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
231d0 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
231e0 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
231f0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
23200 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
23210 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
23220 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
23230 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
23240 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
23250 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
23260 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
23270 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
23280 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
23290 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
232a0 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
232b0 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
232c0 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
232d0 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
232e0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
232f0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
23300 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
23310 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
23320 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
23330 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
23340 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
23350 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
23360 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
23370 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
23380 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
23390 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
233a0 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
233b0 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
233c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
233d0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
233e0 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
233f0 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
23400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23410 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
23420 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
23430 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
23440 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
23450 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
23460 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
23470 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
23480 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
23490 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
234a0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
234b0 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
234c0 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
234d0 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
234e0 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
234f0 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
23500 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
23510 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
23520 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
23530 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
23540 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
23550 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
23560 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
23570 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
23580 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
23590 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
235a0 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
235b0 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
235c0 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
235d0 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
235e0 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
235f0 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a  r we are the.  *
23600 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
23610 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
23620 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
23630 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
23640 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
23650 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
23660 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
23670 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
23680 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
23690 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
236a0 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
236b0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
236c0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  =0) );..  /*.  *
236d0 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
236e0 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
236f0 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
23700 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
23710 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
23720 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46  gno>1 );.  pageF
23730 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44  lags = pPage->aD
23740 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
23750 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
23760 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
23770 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
23780 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
23790 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
237a0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
237b0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b  ew[i] = pgnoOld[
237c0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
237d0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
237e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
237f0 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
23800 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
23810 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
23820 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
23830 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
23840 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
23850 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
23860 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
23870 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
23880 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67   &pgnoNew[i], pg
23890 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a  noNew[i-1], 0);.
238a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
238b0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
238c0 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
238d0 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
238e0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a    nNew++;.    }.
238f0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
23900 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
23910 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
23920 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74  y old pages that
23930 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64   were not reused
23940 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20   as new pages.. 
23950 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   */.  while( i<n
23960 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Old ){.    rc = 
23970 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
23980 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
23990 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
239a0 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61  eanup;.    relea
239b0 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
239c0 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d  ;.    apOld[i] =
239d0 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d   0;.    i++;.  }
239e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20  ..  /*.  ** Put 
239f0 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e  the new pages in
23a00 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
23a10 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f  .  This helps to
23a20 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69  .  ** keep entri
23a30 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
23a40 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20  ile in order so 
23a50 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a  that a scan.  **
23a60 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
23a70 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
23a80 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e  hrough the file.
23a90 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74    That.  ** in t
23aa0 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70  urn helps the op
23ab0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74  erating system t
23ac0 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a  o deliver pages.
23ad0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69    ** from the di
23ae0 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e  sk more rapidly.
23af0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28  .  **.  ** An O(
23b00 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73  n^2) insertion s
23b10 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ort algorithm is
23b20 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65   used, but since
23b30 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72  .  ** n is never
23b40 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61   more than NB (a
23b50 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29   small constant)
23b60 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20  , that should.  
23b70 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ** not be a prob
23b80 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  lem..  **.  ** W
23b90 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20  hen NB==3, this 
23ba0 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  one optimization
23bb0 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62   makes the datab
23bc0 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32  ase.  ** about 2
23bd0 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61  5% faster for la
23be0 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61  rge insertions a
23bf0 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20  nd deletions..  
23c00 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
23c10 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  k-1; i++){.    i
23c20 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65  nt minV = pgnoNe
23c30 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69  w[i];.    int mi
23c40 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
23c50 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
23c60 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
23c70 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64  New[j]<(unsigned
23c80 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
23c90 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
23ca0 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65     minV = pgnoNe
23cb0 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  w[j];.      }.  
23cc0 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
23cd0 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >i ){.      int 
23ce0 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  t;.      MemPage
23cf0 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20   *pT;.      t = 
23d00 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  pgnoNew[i];.    
23d10 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b    pT = apNew[i];
23d20 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
23d30 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49  ] = pgnoNew[minI
23d40 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
23d50 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
23d60 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d  .      pgnoNew[m
23d70 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20  inI] = t;.      
23d80 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
23d90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
23da0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
23db0 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65  ld: %d %d %d  ne
23dc0 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29  w: %d(%d) %d(%d)
23dd0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
23de0 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67  d(%d)\n",.    pg
23df0 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e  noOld[0], .    n
23e00 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=2 ? pgnoOld
23e10 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c  [1] : 0,.    nOl
23e20 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32  d>=3 ? pgnoOld[2
23e30 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e  ] : 0,.    pgnoN
23e40 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c  ew[0], szNew[0],
23e50 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70  .    nNew>=2 ? p
23e60 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e  gnoNew[1] : 0, n
23e70 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
23e80 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
23e90 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20  =3 ? pgnoNew[2] 
23ea0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
23eb0 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
23ec0 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e   nNew>=4 ? pgnoN
23ed0 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[3] : 0, nNew>
23ee0 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20  =4 ? szNew[3] : 
23ef0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f  0,.    nNew>=5 ?
23f00 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c   pgnoNew[4] : 0,
23f10 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
23f20 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a  [4] : 0));..  /*
23f30 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
23f40 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
23f50 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
23f60 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
23f70 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
23f80 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
23f90 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
23fa0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
23fb0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
23fc0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
23fd0 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
23fe0 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
23ff0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
24000 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
24010 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
24020 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
24030 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
24040 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77  w->pgno==pgnoNew
24050 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 6d  [i] );.    assem
24060 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
24070 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
24080 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
24090 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
240a0 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
240b0 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
240c0 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
240d0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
240e0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
240f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24100 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
24110 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
24120 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
24130 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
24140 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
24150 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a  p entries.    **
24160 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
24170 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74  he siblings that
24180 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64   were rearranged
24190 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20  . These can be: 
241a0 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c  left.    ** chil
241b0 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74  dren of cells, t
241c0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
241d0 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f  f the page, or o
241e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20  verflow pages.  
241f0 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
24200 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f  by cells..    */
24210 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
24220 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
24230 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74    for(k=j; k<cnt
24240 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20  New[i]; k++){.  
24250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
24260 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
24270 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b       if( aFrom[k
24280 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70  ]==0xFF || apCop
24290 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e  y[aFrom[k]]->pgn
242a0 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
242b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
242c0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e  ptrmapPutOvfl(pN
242d0 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20  ew, k-j);.      
242e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
242f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24300 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
24310 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
24320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
24340 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63  endif..    j = c
24350 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
24360 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
24370 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
24380 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
24390 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
243a0 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
243b0 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
243c0 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
243d0 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
243e0 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31      if( i<nNew-1
243f0 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20   && j<nCell ){. 
24400 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
24410 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
24420 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a  .      int sz;..
24430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
24440 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
24450 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c     pCell = apCel
24460 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d  l[j];.      sz =
24470 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61   szCell[j] + lea
24480 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
24490 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65     if( !pNew->le
244a0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  af ){.        me
244b0 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74  mcpy(&pNew->aDat
244c0 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b  a[8], pCell, 4);
244d0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
244e0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
244f0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
24500 09 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20  ./* If the tree 
24510 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
24520 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
24530 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
24540 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
24550 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
24560 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
24570 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
24580 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
24590 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
245a0 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
245b0 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
245c0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
245d0 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
245e0 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
245f0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
24600 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
24610 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
24620 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
24630 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
24640 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
24650 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
24660 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
24670 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
24680 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
24690 5d 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49  ];.        fillI
246a0 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
246b0 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
246c0 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a  ey, 0, 0, 0, &sz
246d0 29 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  );.        iSpac
246e0 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
246f0 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
24700 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
24710 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d   );.        pTem
24720 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
24730 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
24740 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
24750 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b  pTemp = &aSpace[
24760 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20  iSpace];.       
24770 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20   iSpace += sz;. 
24780 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
24790 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65  Space<=pBt->page
247a0 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20  Size*5 );.      
247b0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  }.      rc = ins
247c0 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
247d0 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
247e0 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20  z, pTemp, 4);.  
247f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24800 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
24810 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
24820 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
24830 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
24840 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e  arent,nxDiv), pN
24850 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64  ew->pgno);.#ifnd
24860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
24870 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
24880 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
24890 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
248a0 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61  abase, and not a
248b0 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
248c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75  .      ** then u
248d0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
248e0 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e  r map with an en
248f0 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
24900 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
24910 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c  ** that the cell
24920 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70   just inserted p
24930 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79  oints to (if any
24940 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
24950 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
24960 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61  acuum && !leafDa
24970 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ta ){.        rc
24980 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
24990 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
249a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
249b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
249c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
249d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
249e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
249f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b  .#endif.      j+
24a00 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
24a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
24a20 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
24a30 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
24a40 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
24a50 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
24a60 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
24a70 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
24a80 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
24a90 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
24aa0 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  , &apCopy[nOld-1
24ab0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  ]->aData[8], 4);
24ac0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
24ad0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
24ae0 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  +pParent->nOverf
24af0 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69  low ){.    /* Ri
24b00 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
24b10 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
24b20 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  st child of pPar
24b30 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ent */.    put4b
24b40 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
24b50 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
24b60 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
24b70 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d  ew[nNew-1]);.  }
24b80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67  else{.    /* Rig
24b90 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
24ba0 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c  is the left chil
24bb0 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65  d of the first e
24bc0 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a  ntry in pParent.
24bd0 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
24be0 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64  right-most divid
24bf0 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  er entry */.    
24c00 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
24c10 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
24c20 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e  t, nxDiv), pgnoN
24c30 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d  ew[nNew-1]);.  }
24c40 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61  ..  /*.  ** Repa
24c50 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66  rent children of
24c60 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   all cells..  */
24c70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
24c80 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  ew; i++){.    rc
24c90 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64   = reparentChild
24ca0 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b  Pages(apNew[i]);
24cb0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24cc0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
24cd0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
24ce0 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65   }.  rc = repare
24cf0 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61  ntChildPages(pPa
24d00 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
24d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
24d20 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
24d30 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61  p;..  /*.  ** Ba
24d40 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
24d50 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61   page.  Note tha
24d60 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
24d70 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74  ge (pPage) might
24d80 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
24d90 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
24da0 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68  elist so it migh
24db0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69  t no longer be i
24dc0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
24dd0 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20   But the parent 
24de0 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  page will always
24df0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
24e00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
24e10 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
24e20 29 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  );.  rc = balanc
24e30 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  e(pParent, 0);. 
24e40 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61   .  /*.  ** Clea
24e50 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
24e60 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
24e70 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
24e80 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29  liteFree(apCell)
24e90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
24ea0 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
24eb0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
24ec0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
24ed0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
24ee0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
24ef0 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
24f00 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
24f10 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43  pParent);.  TRAC
24f20 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
24f30 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
24f40 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
24f50 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
24f60 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
24f70 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
24f80 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ll));.  return r
24f90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
24fa0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24fb0 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
24fc0 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
24fd0 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
24fe0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
24ff0 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
25000 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
25010 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
25020 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
25030 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
25040 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
25050 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d  ce_shallower(Mem
25060 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
25070 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25090 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70  The only child p
250a0 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  age of pPage */.
250b0 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
250c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
250d0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
250e0 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e  r pChild */.  in
250f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25100 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
25110 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
25120 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
25130 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54    /* The main BT
25160 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
25170 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72  .  int mxCellPer
25180 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
25190 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
251a0 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70  r of cells per p
251b0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
251c0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
251d0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
251e0 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
251f0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
25200 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20    int *szCell;  
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25220 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
25230 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
25240 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
25250 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
25260 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
25270 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20  ell==0 );.  pBt 
25280 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
25290 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20  mxCellPerPage = 
252a0 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20  MX_CELL(pBt);.  
252b0 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d  apCell = sqliteM
252c0 61 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c  allocRaw( mxCell
252d0 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28  PerPage*(sizeof(
252e0 75 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  u8*)+sizeof(int)
252f0 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c  ) );.  if( apCel
25300 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
25310 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a  LITE_NOMEM;.  sz
25320 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70  Cell = (int*)&ap
25330 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61  Cell[mxCellPerPa
25340 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge];.  if( pPage
25350 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
25360 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f   The table is co
25370 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a  mpletely empty *
25380 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41  /.    TRACE(("BA
25390 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62  LANCE: empty tab
253a0 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  le %d\n", pPage-
253b0 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
253c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
253d0 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20  t page is empty 
253e0 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c  but has one chil
253f0 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  d.  Transfer the
25400 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
25410 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e  ion from that on
25420 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65  e child into the
25430 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74   root page if it
25440 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69   .    ** will fi
25450 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  t.  This reduces
25460 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
25470 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20  e tree by one.. 
25480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
25490 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
254a0 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20   page 1, it has 
254b0 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c  less space avail
254c0 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  able than.    **
254d0 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20   its child (due 
254e0 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20  to the 100 byte 
254f0 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75  header that occu
25500 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rs at the beginn
25510 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ing.    ** of th
25520 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c  e database fle),
25530 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74   so it might not
25540 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64   be able to hold
25550 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20   all of the .   
25560 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
25570 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
25580 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64  ned in the child
25590 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
255a0 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20  e .    ** case, 
255b0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74  then do not do t
255c0 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65  he transfer.  Le
255d0 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79  ave page 1 empty
255e0 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
255f0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
25600 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c  nter to the chil
25610 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69  d page.  The chi
25620 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  ld page becomes.
25630 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75      ** the virtu
25640 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  al root of the t
25650 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
25660 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
25670 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
25680 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
25690 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
256a0 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30  ert( pgnoChild>0
256b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
256c0 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74  pgnoChild<=sqlit
256d0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
256e0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
256f0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
25700 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
25710 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c  Page(pPage->pBt,
25720 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68   pgnoChild, &pCh
25730 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ild, 0);.    if(
25740 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73   rc ) goto end_s
25750 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
25760 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
25770 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
25780 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25790 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64  eInitPage(pChild
257a0 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , pPage);.      
257b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
257c0 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
257d0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
257e0 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
257f0 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ow==0 );.      i
25800 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65  f( pChild->nFree
25810 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  >=100 ){.       
25820 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e   /* The child in
25830 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66  formation will f
25840 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70  it on the root p
25850 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20  age, so do the. 
25860 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a         ** copy *
25870 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
25880 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67  .        zeroPag
25890 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
258a0 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
258b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
258c0 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
258d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70  +){.          ap
258e0 43 65 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Cell[i] = sqlite
258f0 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70  3BtreeFindCell(p
25900 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20  Child,i);.      
25910 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20      szCell[i] = 
25920 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69  cellSizePtr(pChi
25930 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a  ld, apCell[i]);.
25940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25950 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
25960 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43  Page, pChild->nC
25970 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43  ell, apCell, szC
25980 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ell);.        /*
25990 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d   Copy the right-
259a0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
259b0 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65  hild to the pare
259c0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  nt. */.        p
259d0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
259e0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
259f0 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20  Offset+8], .    
25a00 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
25a10 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  (&pChild->aData[
25a20 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65  pChild->hdrOffse
25a30 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  t+8]));.        
25a40 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
25a50 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
25a60 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
25a70 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20   %d transfer to 
25a80 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
25a90 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
25aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25ab0 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73  /* The child has
25ac0 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
25ad0 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  n that will fit 
25ae0 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20  on the root..   
25af0 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65       ** The tree
25b00 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61   is already bala
25b10 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e  nced.  Do nothin
25b20 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52  g. */.        TR
25b30 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
25b40 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74  hild %d will not
25b50 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e   fit on page 1\n
25b60 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
25b70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
25b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63  else{.      memc
25b90 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  py(pPage->aData,
25ba0 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20   pChild->aData, 
25bb0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
25bc0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  leSize);.      p
25bd0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
25be0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
25bf0 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
25c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
25c10 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
25c20 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  e, 0);.      ass
25c30 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
25c40 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65  OK );.      free
25c50 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
25c60 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
25c70 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68  NCE: transfer ch
25c80 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74  ild %d into root
25c90 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
25ca0 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67        pChild->pg
25cb0 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  no, pPage->pgno)
25cc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
25cd0 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
25ce0 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20 20 20  ages(pPage);.   
25cf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
25d00 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
25d10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25d20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25d30 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
25d40 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
25d50 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
25d60 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
25d70 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  Cell; i++){ .   
25d80 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
25d90 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69  PutOvfl(pPage, i
25da0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
25db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25dc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
25dd0 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
25de0 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ce;.        }.  
25df0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
25e00 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  if.    if( rc!=S
25e10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
25e20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
25e30 6e 63 65 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nce;.    release
25e40 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
25e50 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  }.end_shallow_ba
25e60 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 46  lance:.  sqliteF
25e70 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72  ree(apCell);.  r
25e80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
25e90 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67  .** The root pag
25ea0 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a  e is overfull.**
25eb0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61  .** When this ha
25ec0 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20  ppens, Create a 
25ed0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61  new child page a
25ee0 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63  nd copy the.** c
25ef0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
25f00 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69  oot into the chi
25f10 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74  ld.  Then make t
25f20 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
25f30 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
25f40 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f  th rightChild po
25f50 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
25f60 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69  w.** child.   Fi
25f70 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61  nally, call bala
25f80 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f  nce_internal() o
25f90 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a  n the new child.
25fa0 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74  ** to cause it t
25fb0 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74  o split..*/.stat
25fc0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
25fd0 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
25fe0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26000 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
26010 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
26020 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
26030 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  hild;    /* Poin
26040 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69  ter to a new chi
26050 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ld page */.  Pgn
26060 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
26070 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
26080 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
26090 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
260a0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
260b0 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
260c0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
260d0 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ze;     /* Total
260e0 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   usable size of 
260f0 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  a page */.  u8 *
26100 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
26110 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
26120 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  e parent page */
26130 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20  .  u8 *cdata;   
26140 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
26150 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  t of the child p
26160 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  age */.  int hdr
26170 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
26180 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68  Offset to page h
26190 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20  eader in parent 
261a0 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20  */.  int brk;   
261b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
261c0 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66  et to content of
261d0 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70   first cell in p
261e0 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  arent */..  asse
261f0 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  rt( pPage->pPare
26200 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
26210 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
26220 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d  low>0 );.  pBt =
26230 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 72   pPage->pBt;.  r
26240 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
26250 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69  ePage(pBt, &pChi
26260 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20  ld, &pgnoChild, 
26270 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b  pPage->pgno, 0);
26280 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
26290 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
262a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
262b0 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
262c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75  >pDbPage) );.  u
262d0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
262e0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
262f0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
26300 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
26310 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
26320 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
26330 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
26340 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e  cdata = pChild->
26350 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28  aData;.  memcpy(
26360 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72  cdata, &data[hdr
26370 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ], pPage->cellOf
26380 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43  fset+2*pPage->nC
26390 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63  ell-hdr);.  memc
263a0 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20  py(&cdata[brk], 
263b0 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62  &data[brk], usab
263c0 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61  leSize-brk);.  a
263d0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69  ssert( pChild->i
263e0 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63  sInit==0 );.  rc
263f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
26400 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
26410 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
26420 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
26430 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d  eeper_out;.  mem
26440 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
26450 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c  l, pPage->aOvfl,
26460 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
26470 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  w*sizeof(pPage->
26480 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
26490 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
264a0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
264b0 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64  ow;.  if( pChild
264c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
264d0 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65     pChild->nFree
264e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
264f0 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
26500 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  l==pPage->nCell 
26510 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
26520 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
26530 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
26540 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
26550 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
26560 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
26570 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
26580 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
26590 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
265a0 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  to %d\n", pPage-
265b0 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
265c0 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53  gno));.#ifndef S
265d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
265e0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
265f0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
26600 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63     int i;.    rc
26610 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
26620 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20  , pChild->pgno, 
26630 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
26640 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
26650 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
26660 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b  lancedeeper_out;
26670 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26680 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69  pChild->nCell; i
26690 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
266a0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43  ptrmapPutOvfl(pC
266b0 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20  hild, i);.      
266c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
266d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
266e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
266f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
26700 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f  .  rc = balance_
26710 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b  nonroot(pChild);
26720 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  ..balancedeeper_
26730 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
26740 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65  ge(pChild);.  re
26750 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26760 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20  * Decide if the 
26770 70 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73  page pPage needs
26780 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e   to be balanced.
26790 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69    If balancing i
267a0 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63  s.** required, c
267b0 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69  all the appropri
267c0 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  ate balancing ro
267d0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
267e0 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d   int balance(Mem
267f0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
26800 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20   insert){.  int 
26810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26820 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
26830 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  rent==0 ){.    i
26840 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
26850 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  low>0 ){.      r
26860 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  c = balance_deep
26870 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  er(pPage);.    }
26880 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26890 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
268a0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
268b0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
268c0 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29  shallower(pPage)
268d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
268e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
268f0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a  nOverflow>0 || .
26900 20 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74          (!insert
26910 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
26920 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
26930 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a  bleSize*2/3) ){.
26940 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
26950 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65  ce_nonroot(pPage
26960 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
26970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26980 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26990 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f  checks all curso
269a0 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
269b0 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e   table pgnoRoot.
269c0 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68  .** If any of th
269d0 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65  ose cursors were
269e0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
269f0 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66  lag==0 in a diff
26a00 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73  erent.** databas
26a10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20  e connection (a 
26a20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
26a30 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20  ion that shares 
26a40 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63  the pager.** cac
26a50 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72  he with the curr
26a60 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20  ent connection) 
26a70 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63  and that other c
26a80 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  onnection .** is
26a90 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64   not in the Read
26aa0 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61  Uncommmitted sta
26ab0 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  te, then this ro
26ac0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a  utine returns .*
26ad0 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  * SQLITE_LOCKED.
26ae0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69  .**.** In additi
26af0 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66  on to checking f
26b00 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77  or read-locks (w
26b10 68 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  here a read-lock
26b20 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72   .** means a cur
26b30 73 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20  sor opened with 
26b40 77 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20  wrFlag==0) this 
26b50 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76  routine also mov
26b60 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65 20  es.** all write 
26b70 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61 74 20  cursors so that 
26b80 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
26b90 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72  g to the .** fir
26ba0 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72  st Cell on the r
26bb0 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  oot page.  This 
26bc0 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
26bd0 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a  ause an insert .
26be0 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67  ** or delete mig
26bf0 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75  ht change the nu
26c00 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
26c10 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74   a page or delet
26c20 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69  e.** a page enti
26c30 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e  rely and we do n
26c40 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65  ot want to leave
26c50 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a   any cursors .**
26c60 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e   pointing to non
26c70 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65 73 20  -existant pages 
26c80 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  or cells..*/.sta
26c90 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61  tic int checkRea
26ca0 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42  dLocks(Btree *pB
26cb0 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52  tree, Pgno pgnoR
26cc0 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
26cd0 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75  Exclude){.  BtCu
26ce0 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
26cf0 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
26d00 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  e->pBt;.  sqlite
26d10 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  3 *db = pBtree->
26d20 70 53 71 6c 69 74 65 3b 0a 20 20 66 6f 72 28 70  pSqlite;.  for(p
26d30 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
26d40 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
26d50 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75     if( p==pExclu
26d60 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  de ) continue;. 
26d70 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
26d80 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
26d90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
26da0 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d  f( p->pgnoRoot!=
26db0 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69  pgnoRoot ) conti
26dc0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
26dd0 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  wrFlag==0 ){.   
26de0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74     sqlite3 *dbOt
26df0 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d  her = p->pBtree-
26e00 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20 20 20  >pSqlite;.      
26e10 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c  if( dbOther==0 |
26e20 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62 4f 74  |.         (dbOt
26e30 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74  her!=db && (dbOt
26e40 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  her->flags & SQL
26e50 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
26e60 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  ted)==0) ){.    
26e70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26e80 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  E_LOCKED;.      
26e90 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
26ea0 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d  p->pPage->pgno!=
26eb0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  p->pgnoRoot ){. 
26ec0 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28       moveToRoot(
26ed0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
26ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
26f00 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
26f10 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
26f20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
26f30 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
26f40 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
26f50 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
26f60 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
26f70 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
26f80 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
26f90 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
26fa0 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
26fb0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
26fc0 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
26fd0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
26fe0 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
26ff0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
27000 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
27010 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
27020 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
27030 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
27040 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
27050 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
27060 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
27070 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
27080 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  h ignored..*/.in
27090 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
270a0 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72  sert(.  BtCursor
270b0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
270c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
270d0 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74   data into the t
270e0 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72  able of this cur
270f0 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  sor */.  const v
27100 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
27110 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
27120 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ey of the new re
27130 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
27140 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
27150 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20   nData,  /* The 
27160 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20  data of the new 
27170 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
27180 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
27190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
271a0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20  mber of extra 0 
271b0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
271c0 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  to data */.  int
271d0 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20 20   appendBias     
271e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
271f0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c  rue if this is l
27200 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20  ikely an append 
27210 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
27220 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74    int loc;.  int
27230 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67   szNew;.  MemPag
27240 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 53 68  e *pPage;.  BtSh
27250 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
27260 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  ->pBtree->pBt;. 
27270 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27280 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67  oldCell;.  unsig
27290 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c  ned char *newCel
272a0 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 42  l = 0;..  if( pB
272b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
272c0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
272d0 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
272e0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
272f0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   before doing an
27300 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72   insert */.    r
27310 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
27320 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
27330 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
27340 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
27350 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
27360 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75  ly );.  if( !pCu
27370 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
27380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
27390 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72  ERM;   /* Cursor
273a0 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72   not open for wr
273b0 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  iting */.  }.  i
273c0 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
273d0 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCur->pBtree, 
273e0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
273f0 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74  pCur) ){.    ret
27400 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
27410 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
27420 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
27430 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
27440 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65  /.  }..  /* Save
27450 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
27460 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
27470 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
27480 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61   table */.  clea
27490 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
274a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20 20  pCur);.  if( .  
274b0 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
274c0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
274d0 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
274e0 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c  oRoot, pCur)) ||
274f0 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
27500 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
27510 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
27520 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e  Key, nKey, appen
27530 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20  dBias, &loc)).  
27540 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
27550 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  ;.  }..  pPage =
27560 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
27570 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
27580 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
27590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
275a0 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
275b0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b  age->leafData );
275c0 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
275d0 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
275e0 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
275f0 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
27600 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
27610 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
27620 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
27630 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
27640 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
27650 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
27660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27670 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72  e->isInit );.  r
27680 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27690 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
276a0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
276b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
276c0 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d  ewCell = sqliteM
276d0 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c  allocRaw( MX_CEL
276e0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
276f0 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
27700 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27710 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
27720 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
27730 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
27740 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
27750 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
27760 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
27770 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
27780 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
27790 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
277a0 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
277b0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
277c0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
277d0 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d  ) );.  if( loc==
277e0 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49  0 && CURSOR_VALI
277f0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
27800 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f 6c 64  ){.    int szOld
27810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
27820 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
27830 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
27840 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c 64 43  Cell );.    oldC
27850 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ell = sqlite3Btr
27860 65 65 46 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  eeFindCell(pPage
27870 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
27880 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
27890 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
278a0 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
278b0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
278c0 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
278d0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
278e0 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
278f0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
27900 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
27910 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
27920 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72  d_insert;.    dr
27930 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
27940 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b  ur->idx, szOld);
27950 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
27960 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  <0 && pPage->nCe
27970 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ll>0 ){.    asse
27980 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
27990 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78  );.    pCur->idx
279a0 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  ++;.    pCur->in
279b0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
279c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
279d0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
279e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73  ;.  }.  rc = ins
279f0 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
27a00 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c  Cur->idx, newCel
27a10 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
27a20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27a30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
27a40 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62  insert;.  rc = b
27a50 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29  alance(pPage, 1)
27a60 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74  ;.  /* sqlite3Bt
27a70 72 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72  reePageDump(pCur
27a80 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
27a90 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20  oRoot, 1); */.  
27aa0 2f 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  /* fflush(stdout
27ab0 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ); */.  if( rc==
27ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27ad0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
27ae0 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
27af0 74 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  t:.  sqliteFree(
27b00 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  newCell);.  retu
27b10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27b20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
27b30 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
27b40 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
27b50 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
27b60 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
27b70 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
27b80 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
27b90 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
27ba0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
27bb0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
27bc0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
27bd0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
27be0 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
27bf0 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43  rc;.  Pgno pgnoC
27c00 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 53 68  hild = 0;.  BtSh
27c10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
27c20 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a  ->pBtree->pBt;..
27c30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
27c40 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
27c50 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
27c60 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
27c70 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
27c80 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
27c90 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
27ca0 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20   a delete */.   
27cb0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
27cc0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
27cd0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
27ce0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
27cf0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
27d00 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43  Only );.  if( pC
27d10 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65  ur->idx >= pPage
27d20 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72  ->nCell ){.    r
27d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27d40 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73  OR;  /* The curs
27d50 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
27d60 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a  ng to anything *
27d70 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75  /.  }.  if( !pCu
27d80 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
27d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
27da0 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f  ERM;   /* Did no
27db0 74 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73  t open this curs
27dc0 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a  or for writing *
27dd0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63  /.  }.  if( chec
27de0 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d  kReadLocks(pCur-
27df0 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
27e00 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29  gnoRoot, pCur) )
27e10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
27e20 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
27e30 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
27e40 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
27e50 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
27e60 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
27e70 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
27e80 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f  position (a no-o
27e90 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  p if the cursor 
27ea0 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20  is not in .  ** 
27eb0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
27ec0 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61  EK state) and sa
27ed0 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
27ee0 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
27ef0 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e  rsors .  ** open
27f00 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
27f10 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71  le. Then call sq
27f20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27f30 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  ) on the page.  
27f40 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ** that the entr
27f50 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  y will be delete
27f60 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69  d from..  */.  i
27f70 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65  f( .    (rc = re
27f80 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
27f90 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
27fa0 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
27fb0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
27fc0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
27fd0 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20  Root, pCur))!=0 
27fe0 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c  ||.    (rc = sql
27ff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28000 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
28010 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
28020 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
28030 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
28040 20 77 69 74 68 69 6e 20 69 74 27 73 20 70 61 67   within it's pag
28050 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c  e and leave pCel
28060 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  l pointing to th
28070 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65  e.  ** data. The
28080 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c   clearCell() cal
28090 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72  l frees any over
280a0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
280b0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
280c0 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65   ** cell. The ce
280d0 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69  ll itself is sti
280e0 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a  ll intact..  */.
280f0 20 20 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65    pCell = sqlite
28100 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70  3BtreeFindCell(p
28110 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
28120 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
28130 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
28140 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
28150 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  (pCell);.  }.  r
28160 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
28170 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69  age, pCell);.  i
28180 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
28190 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
281a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
281b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72  .    ** The entr
281c0 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  y we are about t
281d0 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20  o delete is not 
281e0 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20  a leaf so if we 
281f0 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f  do not.    ** do
28200 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69   something we wi
28210 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20  ll leave a hole 
28220 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70  on an internal p
28230 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68  age..    ** We h
28240 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ave to fill the 
28250 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69  hole by moving i
28260 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  n a cell from a 
28270 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a  leaf.  The.    *
28280 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65  * next Cell afte
28290 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20  r the one to be 
282a0 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61  deleted is guara
282b0 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61  nteed to exist a
282c0 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  nd.    ** to be 
282d0 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e  a leaf so we can
282e0 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a   use it..    */.
282f0 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61      BtCursor lea
28300 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e  fCur;.    unsign
28310 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a  ed char *pNext;.
28320 20 20 20 20 69 6e 74 20 73 7a 4e 65 78 74 3b 20      int szNext; 
28330 20 2f 2a 20 54 68 65 20 63 6f 6d 70 69 6c 65 72   /* The compiler
28340 20 77 61 72 6e 69 6e 67 20 69 73 20 77 72 6f 6e   warning is wron
28350 67 3a 20 73 7a 4e 65 78 74 20 69 73 20 61 6c 77  g: szNext is alw
28360 61 79 73 20 0a 20 20 20 20 20 20 20 20 20 20 20  ays .           
28370 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
28380 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e  ized before use.
28390 20 20 41 64 64 69 6e 67 20 61 6e 20 65 78 74 72    Adding an extr
283a0 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  a initialization
283b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
283c0 20 20 2a 2a 20 74 6f 20 73 69 6c 65 6e 63 65 20    ** to silence 
283d0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 73 6c 6f  the compiler slo
283e0 77 73 20 64 6f 77 6e 20 74 68 65 20 63 6f 64 65  ws down the code
283f0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f 74  . */.    int not
28400 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
28410 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
28420 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
28430 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44  t( !pPage->leafD
28440 61 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ata );.    sqlit
28450 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
28460 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
28470 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
28480 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
28490 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
284a0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
284b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
284c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
284d0 50 61 67 65 72 57 72 69 74 65 28 6c 65 61 66 43  PagerWrite(leafC
284e0 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ur.pPage->pDbPag
284f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
28500 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28510 29 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  ){.      TRACE((
28520 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
28530 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
28540 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
28550 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
28560 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
28570 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
28580 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72  e->pgno, leafCur
28590 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a  .pPage->pgno));.
285a0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
285b0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
285c0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
285d0 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
285e0 20 20 20 70 4e 65 78 74 20 3d 20 73 71 6c 69 74     pNext = sqlit
285f0 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28  e3BtreeFindCell(
28600 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c  leafCur.pPage, l
28610 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20 20 20  eafCur.idx);.   
28620 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c     szNext = cell
28630 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75 72 2e  SizePtr(leafCur.
28640 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20  pPage, pNext);. 
28650 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f       assert( MX_
28660 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d  CELL_SIZE(pBt)>=
28670 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20  szNext+4 );.    
28680 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c    tempCell = sql
28690 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58  iteMallocRaw( MX
286a0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
286b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d  );.      if( tem
286c0 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
286d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
286e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
286f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
28700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28710 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43      rc = insertC
28720 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
28730 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73  >idx, pNext-4, s
28740 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c  zNext+4, tempCel
28750 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
28760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  OK ){.      put4
28780 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
28790 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  wCell(pPage, pCu
287a0 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69  r->idx), pgnoChi
287b0 6c 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ld);.      rc = 
287c0 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30  balance(pPage, 0
287d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
287e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
287f0 7b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  {.      dropCell
28800 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
28810 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e  leafCur.idx, szN
28820 65 78 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ext);.      rc =
28830 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75 72   balance(leafCur
28840 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  .pPage, 0);.    
28850 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
28860 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20  (tempCell);.    
28870 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
28880 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c  aseTempCursor(&l
28890 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  eafCur);.  }else
288a0 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45  {.    TRACE(("DE
288b0 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
288c0 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20  elete from leaf 
288d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43  %d\n",.       pC
288e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
288f0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
28900 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
28910 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c   pCur->idx, cell
28920 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
28930 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d  Cell));.    rc =
28940 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
28950 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
28960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28970 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
28980 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ur);.  }.  retur
28990 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
289a0 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65  reate a new BTre
289b0 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  e table.  Write 
289c0 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68  into *piTable th
289d0 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
289e0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
289f0 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
28a00 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ble..**.** The t
28a10 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64  ype of type is d
28a20 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
28a30 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
28a40 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  .  Only the.** f
28a50 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20  ollowing values 
28a60 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72  of flags are cur
28a70 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20  rently in use.  
28a80 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72  Other values for
28a90 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20  .** flags might 
28aa0 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20  not work:.**.** 
28ab0 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59      BTREE_INTKEY
28ac0 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20  |BTREE_LEAFDATA 
28ad0 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
28ae0 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77   tables with row
28af0 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42  id keys.**     B
28b00 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20  TREE_ZERODATA   
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
28b20 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69  sed for SQL indi
28b30 63 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ces.*/.int sqlit
28b40 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
28b50 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
28b60 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
28b70 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65  lags){.  BtShare
28b80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
28b90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
28ba0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  t;.  Pgno pgnoRo
28bb0 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ot;.  int rc;.  
28bc0 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
28bd0 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
28be0 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
28bf0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
28c00 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a  action first */.
28c10 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
28c20 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
28c30 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
28c40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
28c50 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
28c60 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64  eadOnly );..#ifd
28c70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
28c80 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
28c90 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
28ca0 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
28cb0 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
28cc0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
28cd0 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20  urn rc;.#else.  
28ce0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
28cf0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
28d00 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
28d10 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
28d20 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
28d30 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
28d40 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
28d50 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
28d60 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
28d70 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
28d80 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74  Creating a new t
28d90 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c  able may probabl
28da0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
28db0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   an existing dat
28dc0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20  abase.    ** to 
28dd0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
28de0 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f  e new tables roo
28df0 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20  t page. In case 
28e00 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a  this page turns.
28e10 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65      ** out to be
28e20 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
28e30 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76  e, delete all ov
28e40 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20  erflow page-map 
28e50 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65  caches.    ** he
28e60 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f  ld by open curso
28e70 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
28e80 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
28e90 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
28ea0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
28eb0 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
28ec0 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
28ed0 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
28ee0 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
28ef0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
28f00 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
28f10 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
28f20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
28f30 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
28f40 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
28f50 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
28f60 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
28f70 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
28f80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
28f90 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
28fa0 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
28fb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28fc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28fd0 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20    pgnoRoot++;.. 
28fe0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
28ff0 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  ot-page may not 
29000 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  be allocated on 
29010 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
29020 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ge, or the.    *
29030 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70  * PENDING_BYTE p
29040 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
29050 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  if( pgnoRoot==PT
29060 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
29070 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
29080 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
29090 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
290a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
290b0 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
290c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
290d0 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
290e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
290f0 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
29100 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
29110 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
29120 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
29130 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
29140 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
29150 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
29160 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
29170 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
29180 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
29190 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
291a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
291b0 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
291c0 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
291d0 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
291e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
291f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29200 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
29210 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
29220 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
29230 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  /* pgnoRoot is t
29240 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  he page that wil
29250 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
29260 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20  e root-page of. 
29270 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
29280 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20  table (assuming 
29290 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74  an error did not
292a0 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20   occur). But we 
292b0 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  were.      ** al
292c0 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65  located pgnoMove
292d0 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69  . If required (i
292e0 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f  .e. if it was no
292f0 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  t allocated.    
29300 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e    ** by extendin
29310 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65  g the file), the
29320 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74   current page at
29330 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f   position pgnoMo
29340 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  ve.      ** is a
29350 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64  lready journaled
29360 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
29370 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
29380 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
29390 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
293a0 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a  ge(pPageMove);..
293b0 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68        /* Move th
293c0 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
293d0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20   at pgnoRoot to 
293e0 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20  pgnoMove. */.   
293f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
29400 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
29410 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
29420 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
29430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29440 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
29450 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
29460 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
29470 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
29480 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
29490 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
294a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
294b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
294c0 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
294d0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
294e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
294f0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
29500 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
29510 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
29520 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
29530 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
29540 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29550 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
29560 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
29570 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29580 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
29590 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
295a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
295b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
295c0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
295d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
295e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
295f0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
29600 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
29610 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
29620 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20  pgnoMove);.     
29630 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
29640 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ot);..      /* O
29650 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61  btain the page a
29660 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20  t pgnoRoot */.  
29670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
296a0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
296b0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
296c0 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
296d0 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
296e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
296f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29710 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
29720 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29730 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
29740 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29760 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
29770 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
29780 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29790 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
297a0 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61       pRoot = pPa
297b0 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a  geMove;.    } ..
297c0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
297d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e  e pointer-map an
297e0 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68  d meta-data with
297f0 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
29800 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  ge number. */.  
29810 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29820 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
29830 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
29840 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
29850 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
29860 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
29870 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29880 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
29890 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
298a0 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f  eta(p, 4, pgnoRo
298b0 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ot);.    if( rc 
298c0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
298d0 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
298e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
298f0 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
29900 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
29910 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
29920 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
29930 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
29940 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29950 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
29960 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
29970 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
29980 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
29990 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
299a0 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45  , flags | PTF_LE
299b0 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  AF);.  sqlite3Pa
299c0 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e  gerUnref(pRoot->
299d0 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54  pDbPage);.  *piT
299e0 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f  able = (int)pgno
299f0 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  Root;.  return S
29a00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29a10 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76  ** Erase the giv
29a20 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
29a30 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69   and all its chi
29a40 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a  ldren.  Return.*
29a50 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  * the page to th
29a60 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73  e freelist..*/.s
29a70 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44  tatic int clearD
29a80 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42  atabasePage(.  B
29a90 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
29aa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
29ab0 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Tree that contai
29ac0 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ns the table */.
29ad0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
29ae0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
29af0 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20  number to clear 
29b00 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
29b10 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61  arent,     /* Pa
29b20 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c  rent page.  NULL
29b30 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f   for the root */
29b40 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46  .  int freePageF
29b50 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c  lag      /* Deal
29b60 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74  locate page if t
29b70 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  rue */.){.  MemP
29b80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
29b90 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
29ba0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
29bb0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
29bc0 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  ( pgno>sqlite3Pa
29bd0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
29be0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
29bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29c00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
29c10 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
29c20 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
29c30 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
29c40 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
29c50 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
29c60 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
29c70 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
29c80 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
29c90 20 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pCell = sqlite3
29ca0 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70 50  BtreeFindCell(pP
29cb0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
29cc0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
29cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61  .      rc = clea
29ce0 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42  rDatabasePage(pB
29cf0 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
29d00 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  l), pPage->pPare
29d10 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  nt, 1);.      if
29d20 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
29d30 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
29d40 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
29d50 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
29d60 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
29d70 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
29d80 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
29d90 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  ut;.  }.  if( !p
29da0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
29db0 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
29dc0 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
29dd0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
29de0 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d  Data[8]), pPage-
29df0 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20  >pParent, 1);.  
29e00 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29e10 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
29e20 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
29e30 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b   freePageFlag ){
29e40 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
29e50 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c  ge(pPage);.  }el
29e60 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
29e70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29e80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d  Page->pDbPage))=
29e90 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61  =0 ){.    zeroPa
29ea0 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
29eb0 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f  >aData[0] | PTF_
29ec0 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61  LEAF);.  }..clea
29ed0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
29ee0 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
29ef0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
29f00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
29f10 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  elete all inform
29f20 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e  ation from a sin
29f30 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
29f40 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62   database.  iTab
29f50 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67  le is.** the pag
29f60 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
29f70 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
29f80 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  e.  After this r
29f90 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a  outine returns,.
29fa0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
29fb0 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73   is empty, but s
29fc0 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  till exists..**.
29fd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29fe0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
29ff0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
2a000 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
2a010 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f  en.** read curso
2a020 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
2a030 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72    Open write cur
2a040 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74  sors are moved t
2a050 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66  o the.** root of
2a060 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   the table..*/.i
2a070 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2a080 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 20  learTable(Btree 
2a090 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
2a0a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
2a0b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2a0c0 70 42 74 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  pBt;.  if( p->in
2a0d0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
2a0e0 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
2a0f0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2a100 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2a110 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2a120 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 68 65 63  .  }.  rc = chec
2a130 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
2a140 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  able, 0);.  if( 
2a150 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2a160 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
2a170 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
2a180 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
2a190 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
2a1a0 6c 65 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  le */.  if( SQLI
2a1b0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
2a1c0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2a1d0 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a   iTable, 0)) ){.
2a1e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a1f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 63 6c 65   }..  return cle
2a200 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2a210 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
2a220 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
2a230 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f  * Erase all info
2a240 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62  rmation in a tab
2a250 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  le and add the r
2a260 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
2a270 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c   to.** the freel
2a280 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ist.  Except, th
2a290 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72  e root of the pr
2a2a0 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74  inciple table (t
2a2b0 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67  he one on.** pag
2a2c0 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64  e 1) is never ad
2a2d0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2a2e0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ist..**.** This 
2a2f0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
2a300 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
2a310 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
2a320 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75  e any open.** cu
2a330 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
2a340 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54  le..**.** If AUT
2a350 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c  OVACUUM is enabl
2a360 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
2a370 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74  at iTable is not
2a380 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f   the last.** roo
2a390 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  t page in the da
2a3a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
2a3b0 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  n the last root 
2a3c0 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  page .** in the 
2a3d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2a3e0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
2a3f0 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
2a400 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61  cupied by.** iTa
2a410 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73  ble and that las
2a420 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  t slot formerly 
2a430 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20  occupied by the 
2a440 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a  last root page.*
2a450 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
2a460 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65  e freelist inste
2a470 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49  ad of iTable.  I
2a480 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a  n this say, all.
2a490 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72  ** root pages ar
2a4a0 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65  e kept at the be
2a4b0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
2a4c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
2a4d0 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73  ich.** is necess
2a4e0 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55  ary for AUTOVACU
2a4f0 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74  UM to work right
2a500 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  .  *piMoved is s
2a510 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61  et to the .** pa
2a520 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75  ge number that u
2a530 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  sed to be the la
2a540 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  st root page in 
2a550 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  the file before.
2a560 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66  ** the move.  If
2a570 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f   no page gets mo
2a580 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73  ved, *piMoved is
2a590 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68   set to 0..** Th
2a5a0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2a5b0 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20   is recorded in 
2a5c0 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20  meta[3] and the 
2a5d0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61  value of.** meta
2a5e0 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62  [3] is updated b
2a5f0 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
2a600 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a610 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  BtreeDropTable(B
2a620 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
2a630 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
2a640 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
2a650 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2a660 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
2a670 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2a680 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2a690 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2a6a0 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2a6b0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2a6c0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2a6d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2a6e0 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
2a6f0 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
2a700 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
2a710 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
2a720 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
2a730 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2a740 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2a750 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
2a760 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
2a770 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
2a780 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
2a790 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
2a7a0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
2a7b0 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
2a7c0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
2a7d0 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
2a7e0 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
2a7f0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
2a800 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
2a810 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
2a820 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2a830 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  D;.  }..  rc = s
2a840 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2a850 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2a860 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29  able, &pPage, 0)
2a870 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2a880 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
2a890 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2a8a0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29  Table(p, iTable)
2a8b0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2a8c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2a8d0 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2a8e0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d   rc;.  }..  *piM
2a8f0 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  oved = 0;..  if(
2a900 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66   iTable>1 ){.#if
2a910 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a920 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72  AUTOVACUUM.    r
2a930 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2a940 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ge);.    release
2a950 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c  Page(pPage);.#el
2a960 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  se.    if( pBt->
2a970 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2a980 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74      Pgno maxRoot
2a990 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pgno;.      rc =
2a9a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2a9b0 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52  Meta(p, 4, &maxR
2a9c0 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ootPgno);.      
2a9d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a9e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2a9f0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2aa00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2aa10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2aa20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d     if( iTable==m
2aa30 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20  axRootPgno ){.  
2aa40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2aa50 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
2aa60 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65  ped is the table
2aa70 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
2aa80 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2aa90 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
2aaa0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70   the database, p
2aab0 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ut the root page
2aac0 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
2aad0 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t. .        */. 
2aae0 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2aaf0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2ab00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2ab10 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2ab20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ab30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ab40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2ab50 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2ab60 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2ab70 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
2ab80 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61  pped does not ha
2ab90 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  ve the largest r
2aba0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
2abb0 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
2abc0 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d  e database. So m
2abd0 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ove the page tha
2abe0 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20  t does into the 
2abf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20  .        ** gap 
2ac00 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
2ac10 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20  ted root-page.. 
2ac20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ac30 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65    MemPage *pMove
2ac40 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2ac50 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2ac60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ac70 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2ac80 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2ac90 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
2aca0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2acb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2acc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2acd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ace0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
2acf0 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50  ge(pBt, pMove, P
2ad00 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2ad10 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  0, iTable);.    
2ad20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ad30 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
2ad40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ad50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2ad60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2ad70 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2ad80 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2ad90 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
2ada0 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
2adb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2adc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2add0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ade0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2adf0 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2ae00 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2ae10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2ae20 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2ae30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ae40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ae50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2ae60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69     }.        *pi
2ae70 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50  Moved = maxRootP
2ae80 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
2ae90 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e      /* Set the n
2aea0 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67  ew 'max-root-pag
2aeb0 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  e' value in the 
2aec0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
2aed0 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
2aee0 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  s the old value 
2aef0 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f  less one, less o
2af00 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20  ne more if that 
2af10 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20  happens to.     
2af20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61   ** be a root-pa
2af30 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ge number, less 
2af40 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61  one again if tha
2af50 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  t is the.      *
2af60 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  * PENDING_BYTE_P
2af70 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  AGE..      */.  
2af80 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
2af90 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78  -;.      if( max
2afa0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  RootPgno==PENDIN
2afb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2afc0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2afd0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2afe0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78   }.      if( max
2aff0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50  RootPgno==PTRMAP
2b000 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78  _PAGENO(pBt, max
2b010 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20  RootPgno) ){.   
2b020 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
2b030 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
2b040 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f    assert( maxRoo
2b050 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  tPgno!=PENDING_B
2b060 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2b070 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
2b080 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
2b090 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f  eta(p, 4, maxRoo
2b0a0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  tPgno);.    }els
2b0b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
2b0c0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2b0d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2b0e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  (pPage);.    }.#
2b0f0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
2b100 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33     /* If sqlite3
2b110 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77  BtreeDropTable w
2b120 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67  as called on pag
2b130 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f  e 1. */.    zero
2b140 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f  Page(pPage, PTF_
2b150 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20  INTKEY|PTF_LEAF 
2b160 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2b170 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
2b180 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
2b190 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
2b1a0 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
2b1b0 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62  n out of a datab
2b1c0 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b  ase file.  Meta[
2b1d0 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d  0].** is the num
2b1e0 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65  ber of free page
2b1f0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
2b200 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
2b210 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68  ta[1].** through
2b220 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76   meta[15] are av
2b230 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
2b240 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73  by higher layers
2b250 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
2b260 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20   read-only, the 
2b270 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f  others are read/
2b280 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  write..** .** Th
2b290 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e  e schema layer n
2b2a0 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75  umbers meta valu
2b2b0 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20  es differently. 
2b2c0 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a   At the schema.*
2b2d0 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65  * layer (and the
2b2e0 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52   SetCookie and R
2b2f0 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65  eadCookie opcode
2b300 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  s) the number of
2b310 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69  .** free pages i
2b320 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20  s not visible.  
2b330 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20  So Cookie[0] is 
2b340 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61  the same as Meta
2b350 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  [1]..*/.int sqli
2b360 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2b370 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
2b380 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a  x, u32 *pMeta){.
2b390 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
2b3a0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  e;.  int rc;.  u
2b3b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2b3c0 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  1;.  BtShared *p
2b3d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
2b3e0 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74  /* Reading a met
2b3f0 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71  a-data value req
2b400 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
2b410 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64  k on page 1 (and
2b420 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   hence.  ** the 
2b430 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
2b440 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69  ble. We grab thi
2b450 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73  s lock regardles
2b460 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a  s of whether or.
2b470 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c    ** not the SQL
2b480 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2b490 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
2b4a0 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65  (the table roote
2b4b0 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31  d at page.  ** 1
2b4c0 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
2b4d0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79   special case by
2b4e0 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2b4f0 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28  ) and lockTable(
2b500 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ))..  */.  rc = 
2b510 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
2b520 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
2b530 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2b540 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
2b550 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
2b560 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
2b570 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20  idx<=15 );.  rc 
2b580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2b590 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31  t(pBt->pPager, 1
2b5a0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
2b5b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b5c0 63 3b 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69  c;.  pP1 = (unsi
2b5d0 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
2b5e0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2b5f0 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65  pDbPage);.  *pMe
2b600 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ta = get4byte(&p
2b610 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b  P1[36 + idx*4]);
2b620 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
2b630 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a  nref(pDbPage);..
2b640 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75    /* If autovacu
2b650 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64  umed is disabled
2b660 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62   in this build b
2b670 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  ut we are trying
2b680 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73   to .  ** access
2b690 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64   an autovacuumed
2b6a0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
2b6b0 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73  make the databas
2b6c0 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a  e readonly. .  *
2b6d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2b6e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b6f0 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20    if( idx==4 && 
2b700 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e  *pMeta>0 ) pBt->
2b710 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65  readOnly = 1;.#e
2b720 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20  ndif..  /* Grab 
2b730 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  the read-lock on
2b740 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63   page 1. */.  rc
2b750 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
2b760 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
2b770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b780 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d  *.** Write meta-
2b790 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b  information back
2b7a0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
2b7b0 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a  se.  Meta[0] is.
2b7c0 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  ** read-only and
2b7d0 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74   may not be writ
2b7e0 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ten..*/.int sqli
2b7f0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
2b800 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
2b810 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29   idx, u32 iMeta)
2b820 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2b830 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
2b840 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
2b850 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
2b860 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20  sert( idx>=1 && 
2b870 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28  idx<=15 );.  if(
2b880 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
2b890 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2b8a0 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
2b8b0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2b8c0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2b8d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
2b8e0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
2b8f0 21 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70  !=0 );.  pP1 = p
2b900 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
2b910 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
2b920 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
2b930 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
2b940 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2b950 74 75 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62  turn rc;.  put4b
2b960 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
2b970 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20  x*4], iMeta);.  
2b980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2b9a0 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20  n the flag byte 
2b9b0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2b9c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
2b9d0 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
2b9e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2b9f0 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  nting to..*/.int
2ba00 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61   sqlite3BtreeFla
2ba10 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
2ba20 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
2ba30 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52  hat about CURSOR
2ba40 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
2ba50 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65  te? Probably nee
2ba60 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72  d to call.  ** r
2ba70 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2ba80 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65  sorPosition() he
2ba90 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61  re..  */.  MemPa
2baa0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2bab0 2d 3e 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72  ->pPage;.  retur
2bac0 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d  n pPage ? pPage-
2bad0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2bae0 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a  rOffset] : 0;.}.
2baf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2bb00 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
2bb10 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65  ted with a BTree
2bb20 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2bb30 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
2bb40 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2bb50 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61  ging only..*/.Pa
2bb60 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  ger *sqlite3Btre
2bb70 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29  ePager(Btree *p)
2bb80 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
2bb90 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69  t->pPager;.}..#i
2bba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bbb0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2bbc0 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
2bbd0 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
2bbe0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
2bbf0 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2bc00 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
2bc10 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
2bc20 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
2bc30 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
2bc40 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2bc50 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
2bc60 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2bc70 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21 70  *zMsg2;.  if( !p
2bc80 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72  Check->mxErr ) r
2bc90 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d  eturn;.  pCheck-
2bca0 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65  >mxErr--;.  pChe
2bcb0 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61  ck->nErr++;.  va
2bcc0 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
2bcd0 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73  at);.  zMsg2 = s
2bce0 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a  qlite3VMPrintf(z
2bcf0 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2bd00 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2bd10 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67   zMsg1==0 ) zMsg
2bd20 31 20 3d 20 22 22 3b 0a 20 20 69 66 28 20 70 43  1 = "";.  if( pC
2bd30 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  heck->zErrMsg ){
2bd40 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20  .    char *zOld 
2bd50 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  = pCheck->zErrMs
2bd60 67 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a  g;.    pCheck->z
2bd70 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
2bd80 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
2bd90 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  (&pCheck->zErrMs
2bda0 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a  g, zOld, "\n", z
2bdb0 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68  Msg1, zMsg2, (ch
2bdc0 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69  ar*)0);.    sqli
2bdd0 74 65 46 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20  teFree(zOld);.  
2bde0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
2bdf0 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68  e3SetString(&pCh
2be00 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d  eck->zErrMsg, zM
2be10 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61  sg1, zMsg2, (cha
2be20 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r*)0);.  }.  sql
2be30 69 74 65 46 72 65 65 28 7a 4d 73 67 32 29 3b 0a  iteFree(zMsg2);.
2be40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2be50 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2be60 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
2be70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2be80 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
2be90 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74  /*.** Add 1 to t
2bea0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
2beb0 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67  nt for page iPag
2bec0 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  e.  If this is t
2bed0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66  he second.** ref
2bee0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
2bef0 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72  ge, add an error
2bf00 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65   message to pChe
2bf10 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20  ck->zErrMsg..** 
2bf20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72  Return 1 if ther
2bf30 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65  e are 2 ore more
2bf40 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2bf50 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66  he page and 0 if
2bf60 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
2bf70 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e  he first referen
2bf80 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a  ce to the page..
2bf90 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b  **.** Also check
2bfa0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
2bfb0 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e  umber is in boun
2bfc0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
2bfd0 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67  t checkRef(Integ
2bfe0 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
2bff0 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72 20  int iPage, char 
2c000 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66  *zContext){.  if
2c010 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
2c020 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61  urn 1;.  if( iPa
2c030 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65  ge>pCheck->nPage
2c040 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20   || iPage<0 ){. 
2c050 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2c060 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2c070 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67  xt, "invalid pag
2c080 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50  e number %d", iP
2c090 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2c0a0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   1;.  }.  if( pC
2c0b0 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
2c0c0 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65  e]==1 ){.    che
2c0d0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2c0e0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32  ck, zContext, "2
2c0f0 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  nd reference to 
2c100 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
2c110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
2c120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70    }.  return  (p
2c130 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
2c140 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66  ge]++)>1;.}..#if
2c150 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c160 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
2c170 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2c180 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
2c190 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61  inter-map for pa
2c1a0 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74  ge iChild maps t
2c1b0 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65  o .** page iPare
2c1c0 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65  nt, pointer type
2c1d0 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74   ptrType. If not
2c1e0 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f  , append an erro
2c1f0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20  r message.** to 
2c200 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  pCheck..*/.stati
2c210 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d  c void checkPtrm
2c220 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ap(.  IntegrityC
2c230 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20  k *pCheck,   /* 
2c240 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  Integrity check 
2c250 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e  context */.  Pgn
2c260 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20  o iChild,       
2c270 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67      /* Child pag
2c280 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38  e number */.  u8
2c290 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
2c2a0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
2c2b0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70   pointer map typ
2c2c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72  e */.  Pgno iPar
2c2d0 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ent,          /*
2c2e0 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
2c2f0 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67  r map parent pag
2c300 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
2c310 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
2c320 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
2c330 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65  description (use
2c340 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29  d for error msg)
2c350 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2c360 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70  .  u8 ePtrmapTyp
2c370 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  e;.  Pgno iPtrma
2c380 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d  pParent;..  rc =
2c390 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63   ptrmapGet(pChec
2c3a0 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20  k->pBt, iChild, 
2c3b0 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69  &ePtrmapType, &i
2c3c0 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
2c3d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c3e0 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  OK ){.    checkA
2c3f0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
2c400 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c   zContext, "Fail
2c410 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61  ed to read ptrma
2c420 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c  p key=%d", iChil
2c430 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  d);.    return;.
2c440 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d    }..  if( ePtrm
2c450 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c  apType!=eType ||
2c460 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d   iPtrmapParent!=
2c470 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63  iParent ){.    c
2c480 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2c490 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
2c4a0 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72 20  .      "Bad ptr 
2c4b0 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64  map entry key=%d
2c4c0 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64   expected=(%d,%d
2c4d0 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20  ) got=(%d,%d)", 
2c4e0 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65  .      iChild, e
2c4f0 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65  Type, iParent, e
2c500 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72  PtrmapType, iPtr
2c510 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  mapParent);.  }.
2c520 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2c530 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
2c540 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c  ity of the freel
2c550 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65  ist or of an ove
2c560 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e  rflow page list.
2c570 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
2c580 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
2c590 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ges on the list 
2c5a0 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  is N..*/.static 
2c5b0 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a  void checkList(.
2c5c0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
2c5d0 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67  Check,  /* Integ
2c5e0 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f  rity checking co
2c5f0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
2c600 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20  sFreeList,      
2c610 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66   /* True for a f
2c620 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20  reelist.  False 
2c630 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  for overflow pag
2c640 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
2c650 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  iPage,          
2c660 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2c670 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65 20   for first page 
2c680 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
2c690 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
2c6a0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
2c6b0 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ed number of pag
2c6c0 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  es in the list *
2c6d0 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
2c6e0 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  xt        /* Con
2c6f0 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d  text for error m
2c700 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  essages */.){.  
2c710 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70  int i;.  int exp
2c720 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74  ected = N;.  int
2c730 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b   iFirst = iPage;
2c740 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20  .  while( N-- > 
2c750 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45  0 && pCheck->mxE
2c760 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65  rr ){.    DbPage
2c770 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20   *pOvflPage;.   
2c780 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2c790 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69  pOvflData;.    i
2c7a0 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20  f( iPage<1 ){.  
2c7b0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
2c7c0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
2c7d0 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25  ext,.         "%
2c7e0 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69  d of %d pages mi
2c7f0 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66  ssing from overf
2c800 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e  low list startin
2c810 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20  g at %d",.      
2c820 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65      N+1, expecte
2c830 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  d, iFirst);.    
2c840 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2c850 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28     if( checkRef(
2c860 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
2c870 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b  Context) ) break
2c880 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2c890 33 50 61 67 65 72 47 65 74 28 70 43 68 65 63 6b  3PagerGet(pCheck
2c8a0 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29  ->pPager, (Pgno)
2c8b0 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67  iPage, &pOvflPag
2c8c0 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  e) ){.      chec
2c8d0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2c8e0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61  k, zContext, "fa
2c8f0 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65  iled to get page
2c900 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
2c910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2c920 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d  .    pOvflData =
2c930 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
2c940 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
2c950 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29  tData(pOvflPage)
2c960 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65  ;.    if( isFree
2c970 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  List ){.      in
2c980 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  t n = get4byte(&
2c990 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23  pOvflData[4]);.#
2c9a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c9b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2c9c0 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
2c9d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2c9e0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
2c9f0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
2ca00 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
2ca10 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
2ca20 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
2ca30 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  dif.      if( n>
2ca40 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61  pCheck->pBt->usa
2ca50 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20  bleSize/4-8 ){. 
2ca60 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
2ca70 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2ca80 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
2ca90 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61     "freelist lea
2caa0 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20  f count too big 
2cab0 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  on page %d", iPa
2cac0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d  ge);.        N--
2cad0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cae0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2caf0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
2cb00 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
2cb10 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2cb20 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d  pOvflData[8+i*4]
2cb30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2cb40 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2cb50 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  M.          if( 
2cb60 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
2cb70 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2cb80 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
2cb90 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ap(pCheck, iFree
2cba0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
2cbb0 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
2cbc0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xt);.          }
2cbd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2cbe0 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63    checkRef(pChec
2cbf0 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43  k, iFreePage, zC
2cc00 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2cc10 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20   }.        N -= 
2cc20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
2cc30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2cc40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2cc50 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
2cc60 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
2cc70 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
2cc80 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61  o-vacuum and iPa
2cc90 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  ge is not the la
2cca0 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  st.      ** page
2ccb0 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   in this overflo
2ccc0 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68  w list, check th
2ccd0 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  at the pointer-m
2cce0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20  ap entry for.   
2ccf0 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
2cd00 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65 73  ing page matches
2cd10 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f   iPage..      */
2cd20 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
2cd30 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
2cd40 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20  um && N>0 ){.   
2cd50 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79 74       i = get4byt
2cd60 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20  e(pOvflData);.  
2cd70 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
2cd80 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52  p(pCheck, i, PTR
2cd90 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
2cda0 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
2cdb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
2cdc0 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65 20  endif.    iPage 
2cdd0 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c  = get4byte(pOvfl
2cde0 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
2cdf0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
2ce00 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23  flPage);.  }.}.#
2ce10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ce20 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
2ce30 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
2ce40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
2ce50 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
2ce60 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61  ** Do various sa
2ce70 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61  nity checks on a
2ce80 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
2ce90 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a  a tree.  Return.
2cea0 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74  ** the tree dept
2ceb0 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72  h.  Root pages r
2cec0 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74  eturn 0.  Parent
2ced0 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a  s of root pages.
2cee0 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64  ** return 1, and
2cef0 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a   so forth..** .*
2cf00 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61  * These checks a
2cf10 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  re done:.**.**  
2cf20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72      1.  Make sur
2cf30 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64  e that cells and
2cf40 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e   freeblocks do n
2cf50 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20  ot overlap.**   
2cf60 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69         but combi
2cf70 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ne to completely
2cf80 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e   cover the page.
2cf90 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b  .**  NO  2.  Mak
2cfa0 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73  e sure cell keys
2cfb0 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a   are in order..*
2cfc0 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20  *  NO  3.  Make 
2cfd0 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c  sure no key is l
2cfe0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
2cff0 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64  l to zLowerBound
2d000 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61  ..**  NO  4.  Ma
2d010 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
2d020 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
2d030 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65  r equal to zUppe
2d040 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20  rBound..**      
2d050 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e  5.  Check the in
2d060 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66  tegrity of overf
2d070 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20  low pages..**   
2d080 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65     6.  Recursive
2d090 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65  ly call checkTre
2d0a0 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69  ePage on all chi
2d0b0 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37  ldren..**      7
2d0c0 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
2d0d0 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20  he depth of all 
2d0e0 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20  children is the 
2d0f0 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e  same..**      8.
2d100 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
2d110 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73   page is at leas
2d120 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c  t 33% full or el
2d130 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  se it is.**     
2d140 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66       the root of
2d150 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74   the tree..*/.st
2d160 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72  atic int checkTr
2d170 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72  eePage(.  Integr
2d180 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
2d190 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74  /* Context for t
2d1a0 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20  he sanity check 
2d1b0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
2d1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2d1d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2d1e0 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a   page to check *
2d1f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2d200 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
2d210 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68  ent page */.  ch
2d220 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ar *zParentConte
2d230 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f  xt  /* Parent co
2d240 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ntext */.){.  Me
2d250 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2d260 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68  int i, rc, depth
2d270 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b  , d2, pgno, cnt;
2d280 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c  .  int hdr, cell
2d290 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65  Start;.  int nCe
2d2a0 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a  ll;.  u8 *data;.
2d2b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2d2c0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
2d2d0 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65  e;.  char zConte
2d2e0 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20  xt[100];.  char 
2d2f0 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  *hit;..  sqlite3
2d300 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2d310 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
2d320 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20  text, "Page %d: 
2d330 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ", iPage);..  /*
2d340 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2d350 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f  page exists.  */
2d360 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d  .  pBt = pCheck-
2d370 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69  >pBt;.  usableSi
2d380 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2d390 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67  Size;.  if( iPag
2d3a0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
2d3b0 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28  .  if( checkRef(
2d3c0 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
2d3d0 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29  ParentContext) )
2d3e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2d3f0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
2d400 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2d410 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50  (Pgno)iPage, &pP
2d420 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  age, 0))!=0 ){. 
2d430 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2d440 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2d450 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62  xt,.       "unab
2d460 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70 61  le to get the pa
2d470 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  ge. error code=%
2d480 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74  d", rc);.    ret
2d490 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
2d4a0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
2d4b0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
2d4c0 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20  e, pParent))!=0 
2d4d0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2d4e0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2d4f0 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
2d500 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c              "sql
2d510 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2d520 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f  e() returns erro
2d530 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b  r code %d", rc);
2d540 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2d550 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
2d560 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
2d570 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74   Check out all t
2d580 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  he cells..  */. 
2d590 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f   depth = 0;.  fo
2d5a0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
2d5b0 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d  nCell && pCheck-
2d5c0 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  >mxErr; i++){.  
2d5d0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
2d5e0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c   int sz;.    Cel
2d5f0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  lInfo info;..   
2d600 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61   /* Check payloa
2d610 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  d overflow pages
2d620 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
2d630 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2d640 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
2d650 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
2d660 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20 70        "On tree p
2d670 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20  age %d cell %d: 
2d680 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20  ", iPage, i);.  
2d690 20 20 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65    pCell = sqlite
2d6a0 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70  3BtreeFindCell(p
2d6b0 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c  Page,i);.    sql
2d6c0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
2d6d0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2d6e0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
2d6f0 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b  sz = info.nData;
2d700 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2d710 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20  >intKey ) sz += 
2d720 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61  info.nKey;.    a
2d730 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e  ssert( sz==info.
2d740 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
2d750 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63  if( sz>info.nLoc
2d760 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  al ){.      int 
2d770 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e  nPage = (sz - in
2d780 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62  fo.nLocal + usab
2d790 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61  leSize - 5)/(usa
2d7a0 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
2d7b0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
2d7c0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
2d7d0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2d7e0 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ow]);.#ifndef SQ
2d7f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2d800 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
2d810 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2d820 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
2d830 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
2d840 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
2d850 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c  VERFLOW1, iPage,
2d860 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
2d870 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2d880 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63   checkList(pChec
2d890 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  k, 0, pgnoOvfl, 
2d8a0 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  nPage, zContext)
2d8b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d8c0 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20  Check sanity of 
2d8d0 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e  left child page.
2d8e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2d8f0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d900 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
2d910 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69  4byte(pCell);.#i
2d920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d930 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2d940 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2d950 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
2d960 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
2d970 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  heck, pgno, PTRM
2d980 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c  AP_BTREE, iPage,
2d990 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
2d9a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2d9b0 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50   d2 = checkTreeP
2d9c0 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c  age(pCheck,pgno,
2d9d0 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b  pPage,zContext);
2d9e0 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26  .      if( i>0 &
2d9f0 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20  & d2!=depth ){. 
2da00 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
2da10 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2da20 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70  ontext, "Child p
2da30 61 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72  age depth differ
2da40 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s");.      }.   
2da50 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20     depth = d2;. 
2da60 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
2da70 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2da80 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2da90 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2daa0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2dab0 74 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  t+8]);.    sqlit
2dac0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2dad0 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
2dae0 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
2daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f                "O
2db00 6e 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67  n page %d at rig
2db10 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61  ht child: ", iPa
2db20 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge);.#ifndef SQL
2db30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2db40 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
2db50 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2db60 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
2db70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50  (pCheck, pgno, P
2db80 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61  TRMAP_BTREE, iPa
2db90 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65  ge, 0);.    }.#e
2dba0 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72  ndif.    checkTr
2dbb0 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70  eePage(pCheck, p
2dbc0 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e  gno, pPage, zCon
2dbd0 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f  text);.  }. .  /
2dbe0 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70  * Check for comp
2dbf0 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66  lete coverage of
2dc00 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20   the page.  */. 
2dc10 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2dc20 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
2dc30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2dc40 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65 4d 61    hit = sqliteMa
2dc50 6c 6c 6f 63 28 20 75 73 61 62 6c 65 53 69 7a 65  lloc( usableSize
2dc60 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b   );.  if( hit ){
2dc70 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
2dc80 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61   1, get2byte(&da
2dc90 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20  ta[hdr+5]));.   
2dca0 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
2dcb0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
2dcc0 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d  .    cellStart =
2dcd0 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
2dce0 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66  age->leaf;.    f
2dcf0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
2dd00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
2dd10 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
2dd20 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69  data[cellStart+i
2dd30 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  *2]);.      int 
2dd40 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
2dd50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
2dd60 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pc]);.      int 
2dd70 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63  j;.      if( (pc
2dd80 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
2dd90 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
2dda0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
2ddb0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
2ddc0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
2ddd0 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
2dde0 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
2ddf0 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
2de00 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
2de10 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
2de20 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
2de30 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
2de40 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
2de50 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
2de60 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
2de70 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
2de80 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
2de90 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
2dea0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
2deb0 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
2dec0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2ded0 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
2dee0 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
2def0 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
2df00 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
2df10 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
2df20 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
2df30 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
2df40 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
2df50 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
2df60 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
2df70 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
2df80 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
2df90 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
2dfa0 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
2dfb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2dfc0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
2dfd0 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
2dfe0 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
2dff0 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
2e000 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
2e010 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
2e020 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
2e030 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
2e040 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
2e050 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2e060 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
2e070 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
2e080 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
2e090 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
2e0a0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2e0b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e0c0 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
2e0d0 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
2e0e0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2e0f0 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
2e100 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
2e110 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
2e120 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
2e130 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
2e140 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
2e150 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
2e160 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
2e170 73 71 6c 69 74 65 46 72 65 65 28 68 69 74 29 3b  sqliteFree(hit);
2e180 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
2e190 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
2e1a0 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64   depth+1;.}.#end
2e1b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2e1c0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2e1d0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
2e1e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2e1f0 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
2e200 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2e210 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65  s a complete che
2e220 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ck of the given 
2e230 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f  BTree file.  aRo
2e240 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72  ot[] is.** an ar
2e250 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d  ray of pages num
2e260 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70  bers were each p
2e270 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68  age number is th
2e280 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a  e root page of.*
2e290 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f  * a table.  nRoo
2e2a0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
2e2b0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
2e2c0 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  oot..**.** If ev
2e2d0 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20  erything checks 
2e2e0 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  out, this routin
2e2f0 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20  e returns NULL. 
2e300 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73   If something is
2e310 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65 72  .** amiss, an er
2e320 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
2e330 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
2e340 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
2e350 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64   malloc().** and
2e360 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2e370 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  at error message
2e380 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54   is returned.  T
2e390 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2e3a0 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
2e3b0 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e  sible for freein
2e3c0 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  g the error mess
2e3d0 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
2e3e0 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  one..*/.char *sq
2e3f0 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72  lite3BtreeIntegr
2e400 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72 65  ityCheck(.  Btre
2e410 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68 65  e *p,     /* The
2e420 20 62 74 72 65 65 20 74 6f 20 62 65 20 63 68 65   btree to be che
2e430 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  cked */.  int *a
2e440 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72  Root,   /* An ar
2e450 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  ray of root page
2e460 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 6e  s numbers for in
2e470 64 69 76 69 64 75 61 6c 20 74 72 65 65 73 20 2a  dividual trees *
2e480 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20  /.  int nRoot,  
2e490 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2e4a0 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b  ntries in aRoot[
2e4b0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72  ] */.  int mxErr
2e4c0 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65 70  ,    /* Stop rep
2e4d0 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61 66  orting errors af
2e4e0 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f  ter this many */
2e4f0 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20 20  .  int *pnErr   
2e500 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72   /* Write number
2e510 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20   of errors seen 
2e520 74 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  to this variable
2e530 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
2e540 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e    int nRef;.  In
2e550 74 65 67 72 69 74 79 43 6b 20 73 43 68 65 63 6b  tegrityCk sCheck
2e560 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2e570 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 6e  t = p->pBt;..  n
2e580 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
2e590 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
2e5a0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c  pPager);.  if( l
2e5b0 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
2e5c0 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  y(p)!=SQLITE_OK 
2e5d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
2e5e0 6c 69 74 65 53 74 72 44 75 70 28 22 55 6e 61 62  liteStrDup("Unab
2e5f0 6c 65 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  le to acquire a 
2e600 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
2e610 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d   database");.  }
2e620 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20  .  sCheck.pBt = 
2e630 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50  pBt;.  sCheck.pP
2e640 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
2e650 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61  er;.  sCheck.nPa
2e660 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
2e670 72 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63  rPagecount(sChec
2e680 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68  k.pPager);.  sCh
2e690 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72  eck.mxErr = mxEr
2e6a0 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72  r;.  sCheck.nErr
2e6b0 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d   = 0;.  *pnErr =
2e6c0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
2e6d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e6e0 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  UM.  if( pBt->nT
2e6f0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  runc!=0 ){.    s
2e700 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42  Check.nPage = pB
2e710 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23  t->nTrunc;.  }.#
2e720 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43 68 65  endif.  if( sChe
2e730 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  ck.nPage==0 ){. 
2e740 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
2e750 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
2e760 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2e770 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20   sCheck.anRef = 
2e780 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
2e790 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
2e7a0 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
2e7b0 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69  anRef[0]) );.  i
2e7c0 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66  f( !sCheck.anRef
2e7d0 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
2e7e0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
2e7f0 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31  ;.    *pnErr = 1
2e800 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
2e810 69 74 65 33 4d 50 72 69 6e 74 66 28 22 55 6e 61  ite3MPrintf("Una
2e820 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64  ble to malloc %d
2e830 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20 20   bytes", .      
2e840 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b    (sCheck.nPage+
2e850 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b  1)*sizeof(sCheck
2e860 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d  .anRef[0]));.  }
2e870 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73  .  for(i=0; i<=s
2e880 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b  Check.nPage; i++
2e890 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  ){ sCheck.anRef[
2e8a0 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20  i] = 0; }.  i = 
2e8b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2e8c0 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c  E(pBt);.  if( i<
2e8d0 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b  =sCheck.nPage ){
2e8e0 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65  .    sCheck.anRe
2e8f0 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  f[i] = 1;.  }.  
2e900 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d  sCheck.zErrMsg =
2e910 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   0;..  /* Check 
2e920 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
2e930 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
2e940 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26  */.  checkList(&
2e950 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62  sCheck, 1, get4b
2e960 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
2e970 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20  ->aData[32]),.  
2e980 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
2e990 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
2e9a0 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61  >aData[36]), "Ma
2e9b0 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b  in freelist: ");
2e9c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c  ..  /* Check all
2e9d0 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a   the tables..  *
2e9e0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
2e9f0 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e 6d  Root && sCheck.m
2ea00 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xErr; i++){.    
2ea10 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20  if( aRoot[i]==0 
2ea20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
2ea30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ea40 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2ea50 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2ea60 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31  um && aRoot[i]>1
2ea70 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50   ){.      checkP
2ea80 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20 61  trmap(&sCheck, a
2ea90 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f  Root[i], PTRMAP_
2eaa0 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29 3b  ROOTPAGE, 0, 0);
2eab0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2eac0 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28    checkTreePage(
2ead0 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69  &sCheck, aRoot[i
2eae0 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20 74  ], 0, "List of t
2eaf0 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20  ree roots: ");. 
2eb00 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
2eb10 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e  re every page in
2eb20 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 66   the file is ref
2eb30 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66  erenced.  */.  f
2eb40 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63  or(i=1; i<=sChec
2eb50 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65 63  k.nPage && sChec
2eb60 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23  k.mxErr; i++){.#
2eb70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2eb80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2eb90 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65   if( sCheck.anRe
2eba0 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f[i]==0 ){.     
2ebb0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2ebc0 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67  &sCheck, 0, "Pag
2ebd0 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73  e %d is never us
2ebe0 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23  ed", i);.    }.#
2ebf0 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 74  else.    /* If t
2ec00 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2ec10 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2ec20 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 74  , make sure no t
2ec30 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20  ables contain.  
2ec40 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
2ec50 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  to pointer-map p
2ec60 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ages..    */.   
2ec70 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65   if( sCheck.anRe
2ec80 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20  f[i]==0 && .    
2ec90 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e     (PTRMAP_PAGEN
2eca0 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20  O(pBt, i)!=i || 
2ecb0 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
2ecc0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
2ecd0 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
2ece0 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69  k, 0, "Page %d i
2ecf0 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69  s never used", i
2ed00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2ed10 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
2ed20 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  !=0 && .       (
2ed30 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2ed40 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d  t, i)==i && pBt-
2ed50 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a  >autoVacuum) ){.
2ed60 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
2ed70 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
2ed80 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61   "Pointer map pa
2ed90 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65 6e  ge %d is referen
2eda0 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ced", i);.    }.
2edb0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
2edc0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
2edd0 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f 74  analysis did not
2ede0 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65 66   leave any unref
2edf0 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20  () pages.  */.  
2ee00 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
2ee10 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28 20  sed(pBt);.  if( 
2ee20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33 50  nRef != sqlite3P
2ee30 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
2ee40 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
2ee50 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2ee60 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  &sCheck, 0, .   
2ee70 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67 20     "Outstanding 
2ee80 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73 20  page count goes 
2ee90 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64 75  from %d to %d du
2eea0 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79 73  ring this analys
2eeb0 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c  is",.      nRef,
2eec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2eed0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
2eee0 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  r).    );.  }.. 
2eef0 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61 6e   /* Clean  up an
2ef00 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 2e  d report errors.
2ef10 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
2ef20 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29  ee(sCheck.anRef)
2ef30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68  ;.  *pnErr = sCh
2ef40 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65 74 75  eck.nErr;.  retu
2ef50 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73  rn sCheck.zErrMs
2ef60 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
2ef70 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2ef80 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f  RITY_CHECK */../
2ef90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2efa0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
2efb0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2efc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2efd0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2efe0 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
2eff0 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  ename(Btree *p){
2f000 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
2f010 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
2f020 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2f030 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d  PagerFilename(p-
2f040 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
2f050 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2f060 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  he pathname of t
2f070 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
2f080 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  t contains the d
2f090 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
2f0a0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
2f0b0 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e  ite3BtreeGetDirn
2f0c0 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
2f0d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
2f0e0 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
2f0f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
2f100 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42  gerDirname(p->pB
2f110 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  t->pPager);.}../
2f120 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2f130 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
2f140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
2f150 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20   this database. 
2f160 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61  The return.** va
2f170 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74  lue of this rout
2f180 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ine is the same 
2f190 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2f1a0 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ether the journa
2f1b0 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  l file.** has be
2f1c0 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f  en created or no
2f1d0 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
2f1e0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
2f1f0 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72  tJournalname(Btr
2f200 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
2f210 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
2f220 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
2f230 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
2f240 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  nalname(p->pBt->
2f250 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e  pPager);.}..#ifn
2f260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f270 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70  VACUUM./*.** Cop
2f280 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  y the complete c
2f290 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f  ontent of pBtFro
2f2a0 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41  m into pBtTo.  A
2f2b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2f2c0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66  must be active f
2f2d0 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a  or both files..*
2f2e0 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
2f2f0 20 66 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61   file pBtFrom ma
2f300 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20  y be reduced by 
2f310 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
2f320 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
2f330 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74  oes wrong, the t
2f340 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42  ransaction on pB
2f350 74 46 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20  tFrom is rolled 
2f360 62 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  back..*/.int sql
2f370 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c  ite3BtreeCopyFil
2f380 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74  e(Btree *pTo, Bt
2f390 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ree *pFrom){.  i
2f3a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f3b0 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61  K;.  Pgno i, nPa
2f3c0 67 65 2c 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b  ge, nToPage, iSk
2f3d0 69 70 3b 0a 0a 20 20 42 74 53 68 61 72 65 64 20  ip;..  BtShared 
2f3e0 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42  *pBtTo = pTo->pB
2f3f0 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  t;.  BtShared *p
2f400 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e  BtFrom = pFrom->
2f410 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d  pBt;..  if( pTo-
2f420 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2f430 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e  WRITE || pFrom->
2f440 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2f450 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
2f460 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2f470 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f  .  }.  if( pBtTo
2f480 2d 3e 70 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->pCursor ) retu
2f490 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
2f4a0 20 20 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69    nToPage = sqli
2f4b0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2f4c0 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  t(pBtTo->pPager)
2f4d0 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
2f4e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2f4f0 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
2f500 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45  r);.  iSkip = PE
2f510 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2f520 70 42 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d  pBtTo);.  for(i=
2f530 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
2f540 20 26 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b   && i<=nPage; i+
2f550 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a  +){.    DbPage *
2f560 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28  pDbPage;.    if(
2f570 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74   i==iSkip ) cont
2f580 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  inue;.    rc = s
2f590 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2f5a0 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20  BtFrom->pPager, 
2f5b0 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  i, &pDbPage);.  
2f5c0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2f5d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2f5e0 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65  e3PagerOverwrite
2f5f0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
2f600 69 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  i, sqlite3PagerG
2f610 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 29  etData(pDbPage))
2f620 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2f630 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
2f640 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2f650 68 65 20 66 69 6c 65 20 69 73 20 73 68 72 69 6e  he file is shrin
2f660 6b 69 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20 74 68  king, journal th
2f670 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  e pages that are
2f680 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64   being truncated
2f690 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
2f6a0 65 79 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ey can be rolled
2f6b0 20 62 61 63 6b 20 69 66 20 74 68 65 20 63 6f 6d   back if the com
2f6c0 6d 69 74 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a  mit fails..  */.
2f6d0 20 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b    for(i=nPage+1;
2f6e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f6f0 26 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b  & i<=nToPage; i+
2f700 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a  +){.    DbPage *
2f710 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28  pDbPage;.    if(
2f720 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74   i==iSkip ) cont
2f730 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  inue;.    rc = s
2f740 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2f750 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c  BtTo->pPager, i,
2f760 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
2f770 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2f780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f790 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
2f7a0 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
2f7b0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
2f7c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 2f 2a 20  DbPage);.    /* 
2f7d0 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20  Yeah.  It seems 
2f7e0 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f  wierd to call Do
2f7f0 6e 74 57 72 69 74 65 28 29 20 72 69 67 68 74 20  ntWrite() right 
2f800 61 66 74 65 72 20 57 72 69 74 65 28 29 2e 20 20  after Write().  
2f810 42 75 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  But.    ** that 
2f820 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 6e  is because the n
2f830 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72  ames of those pr
2f840 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20  ocedures do not 
2f850 65 78 61 63 74 6c 79 20 0a 20 20 20 20 2a 2a 20  exactly .    ** 
2f860 72 65 70 72 65 73 65 6e 74 20 77 68 61 74 20 74  represent what t
2f870 68 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29  hey do.  Write()
2f880 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70   really means "p
2f890 75 74 20 74 68 69 73 20 70 61 67 65 20 69 6e 20  ut this page in 
2f8a0 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  the.    ** rollb
2f8b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
2f8c0 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72 74 79  mark it as dirty
2f8d0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
2f8e0 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20   be written.    
2f8f0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
2f900 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e 22 20  se file later." 
2f910 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75 6e 64   DontWrite() und
2f920 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  oes the second p
2f930 61 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  art of.    ** th
2f940 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20  at and prevents 
2f950 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65  the page from be
2f960 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ing written to t
2f970 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
2f980 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73  e.    ** page is
2f990 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f   still on the ro
2f9a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
2f9b0 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61  though.  And tha
2f9c0 74 20 69 73 20 74 68 65 20 77 68 6f 6c 65 0a 20  t is the whole. 
2f9d0 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6f 66 20 74     ** point of t
2f9e0 68 69 73 20 6c 6f 6f 70 3a 20 74 6f 20 70 75 74  his loop: to put
2f9f0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f   pages on the ro
2fa00 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
2fa10 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
2fa20 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
2fa30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  );.  }.  if( !rc
2fa40 20 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67   && nPage<nToPag
2fa50 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  e ){.    rc = sq
2fa60 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
2fa70 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  te(pBtTo->pPager
2fa80 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , nPage);.  }.. 
2fa90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
2faa0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
2fab0 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20  ack(pTo);.  }.  
2fac0 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 23  return rc;  .}.#
2fad0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2fae0 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a  OMIT_VACUUM */..
2faf0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
2fb00 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73  -zero if a trans
2fb10 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fb20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2fb30 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42  BtreeIsInTrans(B
2fb40 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
2fb50 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54  rn (p && (p->inT
2fb60 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
2fb70 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  E));.}../*.** Re
2fb80 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
2fb90 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
2fba0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
2fbb0 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
2fbc0 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28  e3BtreeIsInStmt(
2fbd0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
2fbe0 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70  urn (p->pBt && p
2fbf0 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a  ->pBt->inStmt);.
2fc00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2fc10 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65  non-zero if a re
2fc20 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74 72  ad (or write) tr
2fc30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
2fc40 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
2fc50 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
2fc60 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
2fc70 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
2fc80 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  (p->inTrans!=TRA
2fc90 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a  NS_NONE));.}../*
2fca0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2fcb0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
2fcc0 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66  ter to a blob of
2fcd0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
2fce0 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e  ed with.** a sin
2fcf0 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  gle shared-btree
2fd00 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20  . The memory is 
2fd10 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63  used by client c
2fd20 6f 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e  ode for it's own
2fd30 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f  .** purposes (fo
2fd40 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74  r example, to st
2fd50 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c  ore a high-level
2fd60 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74   schema associat
2fd70 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
2fd80 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54  shared-btree). T
2fd90 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
2fda0 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65  anages reference
2fdb0 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73   counting issues
2fdc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
2fdd0 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63  t time this is c
2fde0 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65  alled on a share
2fdf0 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20  d-btree, nBytes 
2fe00 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
2fe10 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  ** are allocated
2fe20 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65  , zeroed, and re
2fe30 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
2fe40 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73  ller. For each s
2fe50 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61  ubsequent .** ca
2fe60 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61  ll the nBytes pa
2fe70 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
2fe80 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ed and a pointer
2fe90 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f   to the same blo
2fea0 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72  b.** of memory r
2feb0 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
2fec0 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20  Just before the 
2fed0 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20  shared-btree is 
2fee0 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63  closed, the func
2fef0 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  tion passed as t
2ff00 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67  he .** xFree arg
2ff10 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d  ument when the m
2ff20 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2ff30 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76   was made is inv
2ff40 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  oked on the .** 
2ff50 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65  blob of allocate
2ff60 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66  d memory. This f
2ff70 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
2ff80 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 46 72  ot call sqliteFr
2ff90 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  ee().** on the m
2ffa0 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65  emory, the btree
2ffb0 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74   layer does that
2ffc0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
2ffd0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74  e3BtreeSchema(Bt
2ffe0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  ree *p, int nByt
2fff0 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29  es, void(*xFree)
30000 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53  (void *)){.  BtS
30010 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
30020 70 42 74 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  pBt;.  if( !pBt-
30030 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
30040 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73  pBt->pSchema = s
30050 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74  qliteMalloc(nByt
30060 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46  es);.    pBt->xF
30070 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65  reeSchema = xFre
30080 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
30090 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a  pBt->pSchema;.}.
300a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
300b0 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75 73  ue if another us
300c0 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73  er of the same s
300d0 68 61 72 65 64 20 62 74 72 65 65 20 61 73 20 74  hared btree as t
300e0 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68  he argument.** h
300f0 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65  andle holds an e
30100 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
30110 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
30120 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  er table..*/.int
30130 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
30140 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65 20  emaLocked(Btree 
30150 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 71  *p){.  return (q
30160 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
30170 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
30180 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45  AD_LOCK)!=SQLITE
30190 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  _OK);.}...#ifnde
301a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
301b0 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
301c0 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
301d0 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73  n the table whos
301e0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69  e root page is i
301f0 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63  Tab.  The.** loc
30200 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63  k is a write loc
30210 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b  k if isWritelock
30220 20 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65   is true or a re
30230 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74  ad lock.** if it
30240 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e   is false..*/.in
30250 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  t sqlite3BtreeLo
30260 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
30270 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69  , int iTab, u8 i
30280 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69  sWriteLock){.  i
30290 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
302a0 4b 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65  K;.  u8 lockType
302b0 20 3d 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f   = (isWriteLock?
302c0 57 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f  WRITE_LOCK:READ_
302d0 4c 4f 43 4b 29 3b 0a 20 20 72 63 20 3d 20 71 75  LOCK);.  rc = qu
302e0 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
302f0 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  iTab, lockType);
30300 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
30320 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54   lockTable(p, iT
30330 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  ab, lockType);. 
30340 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30350 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
30360 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
30370 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67  CRBLOB./*.** Arg
30380 75 6d 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20  ument pCsr must 
30390 62 65 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  be a cursor open
303a0 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f  ed for writing o
303b0 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20  n an .** INTKEY 
303c0 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
303d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
303e0 6c 69 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  lid table entry.
303f0 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
30400 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  on modifies the 
30410 64 61 74 61 20 73 74 6f 72 65 64 20 61 73 20 70  data stored as p
30420 61 72 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72  art of that entr
30430 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64  y..** Only the d
30440 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20  ata content may 
30450 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64  only be modified
30460 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
30470 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  ible.** to chang
30480 65 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  e the length of 
30490 74 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e  the data stored.
304a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
304b0 74 72 65 65 50 75 74 44 61 74 61 28 42 74 43 75  treePutData(BtCu
304c0 72 73 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20  rsor *pCsr, u32 
304d0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
304e0 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 42 74 53   void *z){.  BtS
304f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 73  hared *pBt = pCs
30500 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a  r->pBtree->pBt;.
30510 0a 20 20 61 73 73 65 72 74 28 70 43 73 72 2d 3e  .  assert(pCsr->
30520 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
30530 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65  );.  if( pCsr->e
30540 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45  State==CURSOR_RE
30550 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
30560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
30570 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BORT;.  }..  /* 
30580 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65 63 6f  Check some preco
30590 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20  nditions: .  ** 
305a0 20 20 28 61 29 20 74 68 65 20 63 75 72 73 6f 72    (a) the cursor
305b0 20 69 73 20 6f 70 65 6e 20 66 6f 72 20 77 72 69   is open for wri
305c0 74 69 6e 67 2c 0a 20 20 2a 2a 20 20 20 28 62 29  ting,.  **   (b)
305d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   there is no rea
305e0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  d-lock on the ta
305f0 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ble being modifi
30600 65 64 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  ed and.  **   (c
30610 29 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  ) the cursor poi
30620 6e 74 73 20 61 74 20 61 20 76 61 6c 69 64 20 72  nts at a valid r
30630 6f 77 20 6f 66 20 61 6e 20 69 6e 74 4b 65 79 20  ow of an intKey 
30640 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
30650 28 20 21 70 43 73 72 2d 3e 77 72 46 6c 61 67 20  ( !pCsr->wrFlag 
30660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
30670 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
30680 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
30690 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 70  t->readOnly && p
306a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
306b0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
306c0 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  ;.  if( checkRea
306d0 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74  dLocks(pCsr->pBt
306e0 72 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52  ree, pCsr->pgnoR
306f0 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b 0a 20 20  oot, pCsr) ){.  
30700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30710 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
30720 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
30730 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
30740 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ock */.  }.  if(
30750 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCsr->eState==C
30760 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
30770 20 21 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69   !pCsr->pPage->i
30780 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
30790 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
307a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
307b0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
307c0 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  sr, offset, amt,
307d0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
307e0 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f  *)z, 0, 1);.}../
307f0 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  * .** Set a flag
30800 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20   on this cursor 
30810 74 6f 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63  to cache the loc
30820 61 74 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20  ations of pages 
30830 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65  from the .** ove
30840 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74  rflow list for t
30850 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
30860 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
30870 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
30880 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61  * for incrementa
30890 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a  l blob IO only..
308a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
308b0 69 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20  ion sets a flag 
308c0 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c  only. The actual
308d0 20 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63   page location c
308e0 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20  ache.** (stored 
308f0 69 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  in BtCursor.aOve
30900 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f  rflow[]) is allo
30910 63 61 74 65 64 20 61 6e 64 20 75 73 65 64 20 62  cated and used b
30920 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63  y function.** ac
30930 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74  cessPayload() (t
30940 68 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69  he worker functi
30950 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74  on for sqlite3Bt
30960 72 65 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a  reeData() and.**
30970 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 75 74   sqlite3BtreePut
30980 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64  Data())..*/.void
30990 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 61 63   sqlite3BtreeCac
309a0 68 65 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72  heOverflow(BtCur
309b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
309c0 73 65 72 74 28 21 70 43 75 72 2d 3e 69 73 49 6e  sert(!pCur->isIn
309d0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20  crblobHandle);. 
309e0 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
309f0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75  Overflow);.  pCu
30a00 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
30a10 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69  dle = 1;.}.#endi
30a20 66 0a                                            f.