/ Hex Artifact Content
Login

Artifact ca4f2d5c67bb10b76ed9917db8b6a7dd64dbd5f1:


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 38 39 20 32 30 30 37 2f 30  c,v 1.389 2007/0
0190: 36 2f 32 30 20 31 35 3a 31 34 3a 31 30 20 64 72  6/20 15:14:10 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 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
30b0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
30c0: 43 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50 61 67  Cell) \.  ((pPag
30d0: 65 29 2d 3e 61 44 61 74 61 20 2b 20 67 65 74 32  e)->aData + get2
30e0: 62 79 74 65 28 26 28 70 50 61 67 65 29 2d 3e 61  byte(&(pPage)->a
30f0: 44 61 74 61 5b 28 70 50 61 67 65 29 2d 3e 63 65  Data[(pPage)->ce
3100: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43 65 6c  llOffset+2*(iCel
3110: 6c 29 5d 29 29 0a 75 38 20 2a 73 71 6c 69 74 65  l)])).u8 *sqlite
3120: 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 4d  3BtreeFindCell(M
3130: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
3140: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 61 73 73  nt iCell){.  ass
3150: 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b  ert( iCell>=0 );
3160: 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c  .  assert( iCell
3170: 3c 67 65 74 32 62 79 74 65 28 26 70 50 61 67 65  <get2byte(&pPage
3180: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
3190: 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29 3b 0a  drOffset+3]) );.
31a0: 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c    return findCel
31b0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
31c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  .}../*.** This a
31d0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
31e0: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
31f0: 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20  BtreeFindCell() 
3200: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
3210: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
3220: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
3230: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
3240: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
3250: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
3260: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
3270: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
3280: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
3290: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
32a0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
32b0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
32c0: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
32d0: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
32e0: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
32f0: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
3300: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
3310: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
3320: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
3330: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3340: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
3350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3360: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
3370: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
3380: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
3390: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
33a0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
33b0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
33c0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
33d0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
33e0: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
33f0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
3400: 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33  nction.  sqlite3
3410: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
3420: 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c   takes a .** cel
3430: 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73  l index as the s
3440: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
3450: 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nd sqlite3BtreeP
3460: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a  arseCellPtr() .*
3470: 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65  * takes a pointe
3480: 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  r to the body of
3490: 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73   the cell as its
34a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
34b0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ..**.** Within t
34c0: 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61  his file, the pa
34d0: 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20  rseCell() macro 
34e0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  can be called in
34f0: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69  stead of.** sqli
3500: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3510: 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f  lPtr(). Using so
3520: 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68  me compilers, th
3530: 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65  is will be faste
3540: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
3550: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3560: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
3570: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
3580: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
3590: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
35a0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
35b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
35c0: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
35d0: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
35e0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
35f0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
3600: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
3610: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
3620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3630: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63  umber bytes in c
3640: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
3650: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  er */.  u32 nPay
3660: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
3670: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
3680: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
3690: 61 64 20 2a 2f 0a 0a 20 20 70 49 6e 66 6f 2d 3e  ad */..  pInfo->
36a0: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
36b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36c0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
36d0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
36e0: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
36f0: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
3700: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
3710: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
3720: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
3730: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
3740: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
3750: 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65  &nPayload);.  }e
3760: 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
3770: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  d = 0;.  }.  pIn
3780: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
3790: 6c 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67  load;.  if( pPag
37a0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
37b0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
37c0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20  &pCell[n], (u64 
37d0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
37e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33  .  }else{.    u3
37f0: 32 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  2 x;.    n += ge
3800: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
3810: 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20 20 20 70 49  [n], &x);.    pI
3820: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20  nfo->nKey = x;. 
3830: 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78     nPayload += x
3840: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
3850: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
3860: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
3870: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20  ader = n;.  if( 
3880: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
3890: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
38a0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
38b0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
38c0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
38d0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
38e0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
38f0: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
3900: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
3910: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
3920: 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
3930: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
3940: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
3950: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
3960: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
3970: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
3980: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
3990: 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20   = 0;.    nSize 
39a0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a  = nPayload + n;.
39b0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20      if( nSize<4 
39c0: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
39d0: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
39e0: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
39f0: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
3a00: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
3a10: 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b   nSize;.  }else{
3a20: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
3a30: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
3a40: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
3a50: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
3a60: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
3a70: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
3a80: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
3a90: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
3aa0: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
3ab0: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
3ac0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
3ad0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
3ae0: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
3af0: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
3b00: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
3b10: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
3b20: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
3b30: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
3b40: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
3b50: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
3b60: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
3b70: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
3b80: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
3b90: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
3ba0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
3bb0: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
3bc0: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
3bd0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
3be0: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
3bf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
3c00: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
3c10: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
3c20: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
3c30: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
3c40: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
3c50: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
3c60: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
3c70: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
3c80: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
3c90: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
3ca0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
3cb0: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
3cc0: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
3cd0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
3ce0: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
3cf0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
3d00: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
3d10: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
3d20: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
3d30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
3d40: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
3d50: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
3d60: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
3d70: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
3d80: 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  = surplus;.    }
3d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
3da0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c  o->nLocal = minL
3db0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
3dc0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
3dd0: 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c   = pInfo->nLocal
3de0: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
3df0: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
3e00: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
3e10: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
3e20: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
3e30: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
3e40: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
3e50: 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29  eCellPtr((pPage)
3e60: 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67  , findCell((pPag
3e70: 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70  e), (iCell)), (p
3e80: 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69  Info)).void sqli
3e90: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3ea0: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
3eb0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
3ec0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
3ed0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
3ee0: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
3ef0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
3f00: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
3f10: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
3f20: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
3f30: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
3f40: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
3f50: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
3f60: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
3f70: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
3f80: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
3f90: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
3fa0: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
3fb0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
3fc0: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
3fd0: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
3fe0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
3ff0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
4000: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
4010: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
4020: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
4030: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
4040: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
4050: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
4060: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
4070: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
4080: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65  UG.static int ce
4090: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
40a0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
40b0: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
40c0: 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  fo;.  sqlite3Btr
40d0: 65 65 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  eeParseCell(pPag
40e0: 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, iCell, &info)
40f0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
4100: 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nSize;.}.#endif.
4110: 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53  static int cellS
4120: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
4130: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
4140: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
4150: 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  fo;.  sqlite3Btr
4160: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
4170: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
4180: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
4190: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  fo.nSize;.}..#if
41a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
41b0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
41c0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
41d0: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
41e0: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
41f0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
4200: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
4210: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
4220: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
4230: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
4240: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4260: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
4270: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
4280: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 69   u8 *pCell){.  i
4290: 66 28 20 70 43 65 6c 6c 20 29 7b 0a 20 20 20 20  f( pCell ){.    
42a0: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
42b0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
42c0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
42d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
42e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  ;.    assert( (i
42f0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
4300: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
4310: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
4320: 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28  yload );.    if(
4330: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
4340: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
4350: 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
4360: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50  Local ){.      P
4370: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
4380: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
4390: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
43a0: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
43b0: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
43c0: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
43d0: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
43e0: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gno);.    }.  }.
43f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4400: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
4410: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
4420: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
4430: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
4440: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
4450: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
4460: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
4470: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
4480: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
4490: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
44a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
44b0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
44c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
44d0: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
44e0: 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  Cell;.  pCell = 
44f0: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
4500: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
4510: 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
4520: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
4530: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   pCell);.}.#endi
4540: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67  f.../*.** Defrag
4550: 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69  ment the page gi
4560: 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20  ven.  All Cells 
4570: 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
4580: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70  .** end of the p
4590: 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65  age and all free
45a0: 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63   space is collec
45b0: 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20  ted into one.** 
45c0: 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74  big FreeBlk that
45d0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
45e0: 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  en the header an
45f0: 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65  d cell.** pointe
4600: 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20  r array and the 
4610: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
4620: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  a..*/.static int
4630: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
4640: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
4650: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4670: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
4680: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
46a0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d   Address of a i-
46b0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
46c0: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
46e0: 74 20 6f 66 20 66 69 72 73 74 20 62 79 74 65 20  t of first byte 
46f0: 61 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74  after cell point
4700: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
4710: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
4720: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4730: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
4740: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
4750: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4760: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
4770: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
4780: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
4790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
47a0: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
47b0: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
47c0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
47e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
47f0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
4800: 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20  */.  int brk;   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
4830: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
4840: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
4850: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4860: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4870: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
4880: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
4890: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
48a0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
48b0: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
48c0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
48d0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
48e0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
48f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
4900: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
4910: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
4920: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
4930: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
4940: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4950: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
4960: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
4970: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
4980: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4990: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
49a0: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
49b0: 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e  eMalloc( pPage->
49c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
49d0: 0a 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29  .  if( temp==0 )
49e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
49f0: 4f 4d 45 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70  OMEM;.  data = p
4a00: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
4a10: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
4a20: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
4a30: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
4a40: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
4a50: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
4a60: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
4a70: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
4a80: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
4a90: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
4aa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
4ab0: 65 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62  e;.  brk = get2b
4ac0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
4ad0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
4ae0: 70 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72  p[brk], &data[br
4af0: 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  k], usableSize -
4b00: 20 62 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75   brk);.  brk = u
4b10: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72  sableSize;.  for
4b20: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
4b30: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
4b40: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
4b50: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
4b60: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
4b70: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
4b80: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
4b90: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
4ba0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
4bb0: 63 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  c<pPage->pBt->us
4bc0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
4bd0: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
4be0: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
4bf0: 70 63 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d  pc]);.    brk -=
4c00: 20 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70   size;.    memcp
4c10: 79 28 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74  y(&data[brk], &t
4c20: 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  emp[pc], size);.
4c30: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
4c40: 64 72 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  dr, brk);.  }.  
4c50: 61 73 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c  assert( brk>=cel
4c60: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20  lOffset+2*nCell 
4c70: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
4c80: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29  ata[hdr+5], brk)
4c90: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
4ca0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
4cb0: 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  2] = 0;.  data[h
4cc0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64  dr+7] = 0;.  add
4cd0: 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32  r = cellOffset+2
4ce0: 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74  *nCell;.  memset
4cf0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c  (&data[addr], 0,
4d00: 20 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71   brk-addr);.  sq
4d10: 6c 69 74 65 46 72 65 65 28 74 65 6d 70 29 3b 0a  liteFree(temp);.
4d20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4d30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
4d40: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
4d50: 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20  s of space on a 
4d60: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  page..**.** Retu
4d70: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
4d80: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
4d90: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
4da0: 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  te of.** the new
4db0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20   allocation. Or 
4dc0: 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  return 0 if ther
4dd0: 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
4de0: 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e  free.** space on
4df0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61 74   the page to sat
4e00: 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74  isfy the allocat
4e10: 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  ion request..**.
4e20: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  ** If the page c
4e30: 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f  ontains nBytes o
4e40: 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74  f free space but
4e50: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
4e60: 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63  n.** nBytes of c
4e70: 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73  ontiguous free s
4e80: 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  pace, then this 
4e90: 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69  routine automati
4ea0: 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64  cally.** calls d
4eb0: 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29  efragementPage()
4ec0: 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20   to consolidate 
4ed0: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62  all free space b
4ee0: 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  efore .** alloca
4ef0: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75  ting the new chu
4f00: 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nk..*/.static in
4f10: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
4f20: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4f30: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
4f40: 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b  t addr, pc, hdr;
4f50: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
4f60: 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20  nt nFrag;.  int 
4f70: 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  top;.  int nCell
4f80: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
4f90: 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  et;.  unsigned c
4fa0: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20  har *data;.  .  
4fb0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
4fc0: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ata;.  assert( s
4fd0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
4fe0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
4ff0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
5000: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
5010: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 34 20  ;.  if( nByte<4 
5020: 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69  ) nByte = 4;.  i
5030: 66 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  f( pPage->nFree<
5040: 6e 42 79 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e  nByte || pPage->
5050: 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 20 72 65  nOverflow>0 ) re
5060: 74 75 72 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d  turn 0;.  pPage-
5070: 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b  >nFree -= nByte;
5080: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
5090: 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46  hdrOffset;..  nF
50a0: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
50b0: 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3c 36  ];.  if( nFrag<6
50c0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
50d0: 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ch the freelist 
50e0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c  looking for a sl
50f0: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
5100: 20 73 61 74 69 73 66 79 20 74 68 65 0a 20 20 20   satisfy the.   
5110: 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75 65 73   ** space reques
5120: 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d  t. */.    addr =
5130: 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c   hdr+1;.    whil
5140: 65 28 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  e( (pc = get2byt
5150: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
5160: 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a 65 20  0 ){.      size 
5170: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5180: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
5190: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
51a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 69  {.        if( si
51b0: 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20  ze<nByte+4 ){.  
51c0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
51d0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
51e0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
51f0: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
5200: 20 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a 65 20   = nFrag + size 
5210: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
5220: 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a 20 20     return pc;.  
5230: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5240: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
5250: 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a  &data[pc+2], siz
5260: 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  e-nByte);.      
5270: 20 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20      return pc + 
5280: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
5290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
52a0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 63 3b        addr = pc;
52b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
52c0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
52d0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
52e0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
52f0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
5300: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
5310: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
5320: 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74    */.  top = get
5330: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
5340: 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67  5]);.  nCell = g
5350: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5360: 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66  r+3]);.  cellOff
5370: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
5380: 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 6e  lOffset;.  if( n
5390: 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c  Frag>=60 || cell
53a0: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
53b0: 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65 20 29   > top - nByte )
53c0: 7b 0a 20 20 20 20 69 66 28 20 64 65 66 72 61 67  {.    if( defrag
53d0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 20  mentPage(pPage) 
53e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
53f0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
5400: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
5410: 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  }.  top -= nByte
5420: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c  ;.  assert( cell
5430: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
5440: 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 70 75 74   <= top );.  put
5450: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
5460: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75  5], top);.  retu
5470: 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn top;.}../*.**
5480: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
5490: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
54a0: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
54b0: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
54c0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
54d0: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
54e0: 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73  s pPage->aDisk[s
54f0: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
5500: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
5510: 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74  ck is "size" byt
5520: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f  es..**.** Most o
5530: 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72  f the effort her
5540: 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  e is involved in
5550: 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63   coalesing adjac
5560: 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63  ent.** free bloc
5570: 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ks into a single
5580: 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e   big free block.
5590: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
55a0: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
55b0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
55c0: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
55d0: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
55e0: 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67  in, hdr;.  unsig
55f0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
5600: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
5610: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5620: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
5630: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5640: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
5650: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
5660: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
5670: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
5680: 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  t+6+(pPage->leaf
5690: 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72  ?0:4) );.  asser
56a0: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
56b0: 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )<=pPage->pBt->u
56c0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
56d0: 66 28 20 73 69 7a 65 3c 34 20 29 20 73 69 7a 65  f( size<4 ) size
56e0: 20 3d 20 34 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 4;..#ifdef SQ
56f0: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
5700: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
5710: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
5720: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
5730: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
5740: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
5750: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
5760: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
5770: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
5780: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
5790: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
57a0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
57b0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
57c0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
57d0: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
57e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
57f0: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
5800: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
5810: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
5820: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
5830: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
5840: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
5850: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
5860: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
5870: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
5880: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
5890: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
58a0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
58b0: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
58c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
58d0: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 );.  assert( p
58e0: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
58f0: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
5900: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5910: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
5920: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
5930: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
5940: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
5950: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
5960: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
5970: 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61   size;..  /* Coa
5980: 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66  lesce adjacent f
5990: 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ree blocks */.  
59a0: 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64  addr = pPage->hd
59b0: 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77  rOffset + 1;.  w
59c0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
59d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
59e0: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
59f0: 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65  int pnext, psize
5a00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
5a10: 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20  egin>addr );.   
5a20: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
5a30: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
5a40: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
5a50: 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74   pnext = get2byt
5a60: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29  e(&data[pbegin])
5a70: 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65  ;.    psize = ge
5a80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
5a90: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  gin+2]);.    if(
5aa0: 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20   pbegin + psize 
5ab0: 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20  + 3 >= pnext && 
5ac0: 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pnext>0 ){.     
5ad0: 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78   int frag = pnex
5ae0: 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a  t - (pbegin+psiz
5af0: 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
5b00: 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61  ( frag<=data[pPa
5b10: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
5b20: 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70   );.      data[p
5b30: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
5b40: 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20  7] -= frag;.    
5b50: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5b60: 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79  [pbegin], get2by
5b70: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29  te(&data[pnext])
5b80: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
5b90: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
5ba0: 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74  ], pnext+get2byt
5bb0: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
5bc0: 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d  )-pbegin);.    }
5bd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
5be0: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
5bf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
5c00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
5c10: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
5c20: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
5c30: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
5c40: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
5c50: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
5c60: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
5c70: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
5c80: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
5c90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5ca0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
5cb0: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
5cc0: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
5cd0: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
5ce0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5cf0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74  hdr+5]);.    put
5d00: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
5d10: 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79  5], top + get2by
5d20: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
5d30: 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  2]));.  }.}../*.
5d40: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
5d50: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
5d60: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
5d70: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
5d80: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
5d90: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
5da0: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
5db0: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
5dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5dd0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
5de0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
5df0: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
5e00: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
5e10: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
5e20: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
5e30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
5e40: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
5e50: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
5e60: 20 30 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e   0) );.  pPage->
5e70: 69 6e 74 4b 65 79 20 3d 20 28 66 6c 61 67 42 79  intKey = (flagBy
5e80: 74 65 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59  te & (PTF_INTKEY
5e90: 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21  |PTF_LEAFDATA))!
5ea0: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72  =0;.  pPage->zer
5eb0: 6f 44 61 74 61 20 3d 20 28 66 6c 61 67 42 79 74  oData = (flagByt
5ec0: 65 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41  e & PTF_ZERODATA
5ed0: 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  )!=0;.  pPage->l
5ee0: 65 61 66 20 3d 20 28 66 6c 61 67 42 79 74 65 20  eaf = (flagByte 
5ef0: 26 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a  & PTF_LEAF)!=0;.
5f00: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
5f10: 72 53 69 7a 65 20 3d 20 34 2a 28 70 50 61 67 65  rSize = 4*(pPage
5f20: 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a 20 20 70 42  ->leaf==0);.  pB
5f30: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
5f40: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 20 26    if( flagByte &
5f50: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 7b   PTF_LEAFDATA ){
5f60: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  .    pPage->leaf
5f70: 44 61 74 61 20 3d 20 31 3b 0a 20 20 20 20 70 50  Data = 1;.    pP
5f80: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
5f90: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
5fa0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
5fb0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
5fc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5fd0: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d  Page->leafData =
5fe0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
5ff0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
6000: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
6010: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
6020: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
6030: 7d 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61  }.  pPage->hasDa
6040: 74 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65  ta = !(pPage->ze
6050: 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67  roData || (!pPag
6060: 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65  e->leaf && pPage
6070: 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 7d 0a  ->leafData));.}.
6080: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
6090: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
60a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
60b0: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
60c0: 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 20  .** The pParent 
60d0: 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62  parameter must b
60e0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
60f0: 68 65 20 4d 65 6d 50 61 67 65 20 77 68 69 63 68  he MemPage which
6100: 0a 2a 2a 20 69 73 20 74 68 65 20 70 61 72 65 6e  .** is the paren
6110: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 62 65  t of the page be
6120: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  ing initialized.
6130: 20 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a    The root of a.
6140: 2a 2a 20 42 54 72 65 65 20 68 61 73 20 6e 6f 20  ** BTree has no 
6150: 70 61 72 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f  parent and so fo
6160: 72 20 74 68 61 74 20 70 61 67 65 2c 20 70 50 61  r that page, pPa
6170: 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  rent==NULL..**.*
6180: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
6190: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
61a0: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
61b0: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
61c0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
61d0: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
61e0: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
61f0: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
6200: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
6210: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
6220: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
6230: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
6240: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
6250: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
6260: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
6270: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
6280: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
6290: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruption..*/.int 
62a0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
62b0: 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
62c0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  *pPage,        /
62d0: 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
62e0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
62f0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
6300: 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  nt       /* The 
6310: 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  parent.  Might b
6320: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  e NULL */.){.  i
6330: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
6340: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
6350: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
6360: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
6370: 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  ] */.  int hdr; 
6380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
6390: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
63a0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
63b0: 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
63c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
63d0: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
63e0: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
63f0: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
6400: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
6410: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
6420: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
6430: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
6440: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
6450: 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
6460: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
6470: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
6480: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
6490: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
64a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  r */.  int nFree
64b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
64c0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
64d0: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
64e0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
64f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
6500: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
6510: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
6520: 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  /..  pBt = pPage
6530: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
6540: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73   pBt!=0 );.  ass
6550: 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20  ert( pParent==0 
6560: 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d  || pParent->pBt=
6570: 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  =pBt );.  assert
6580: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
6590: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
65a0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
65b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
65c0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
65d0: 3d 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63  == &((unsigned c
65e0: 68 61 72 2a 29 70 50 61 67 65 29 5b 2d 70 42 74  har*)pPage)[-pBt
65f0: 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29 3b 0a 20  ->pageSize] );. 
6600: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
6610: 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20  ent!=pParent && 
6620: 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21  (pPage->pParent!
6630: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49  =0 || pPage->isI
6640: 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nit) ){.    /* T
6650: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  he parent page s
6660: 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e  hould never chan
6670: 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  ge unless the fi
6680: 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f  le is corrupt */
6690: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
66a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
66b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
66c0: 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  ->isInit ) retur
66d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
66e0: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
66f0: 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  t==0 && pParent!
6700: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  =0 ){.    pPage-
6710: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
6720: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  nt;.    sqlite3P
6730: 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
6740: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
6750: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
6760: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
6770: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
6780: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
6790: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
67a0: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
67b0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
67c0: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
67d0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
67e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
67f0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
6800: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
6810: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
6820: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
6830: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
6840: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
6850: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
6860: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6870: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
6880: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
6890: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
68a0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
68b0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
68c0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
68d0: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
68e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
68f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6900: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  }.  if( pPage->n
6910: 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
6920: 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt!=0 && pParent
6930: 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
6940: 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75   /* All pages mu
6950: 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  st have at least
6960: 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70   one cell, excep
6970: 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73  t for root pages
6980: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
6990: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
69a0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  PT;.  }..  /* Co
69b0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
69c0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
69d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d  e page */.  pc =
69e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
69f0: 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
6a00: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
6a10: 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73   top - (cellOffs
6a20: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
6a30: 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ell);.  while( p
6a40: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  c>0 ){.    int n
6a50: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
6a60: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
6a70: 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  -4 ){.      /* F
6a80: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
6a90: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
6aa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6ab0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
6ac0: 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d      }.    next =
6ad0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6ae0: 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  pc]);.    size =
6af0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6b00: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
6b10: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
6b20: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
6b30: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
6b40: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
6b50: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
6b60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6b70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6b80: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72  ; .    }.    nFr
6b90: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ee += size;.    
6ba0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20  pc = next;.  }. 
6bb0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
6bc0: 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72  nFree;.  if( nFr
6bd0: 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ee>=usableSize )
6be0: 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70  {.    /* Free sp
6bf0: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
6c00: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
6c10: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
6c20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6c30: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61  KPT; .  }..  pPa
6c40: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
6c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
6c70: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
6c80: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
6c90: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
6ca0: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
6cb0: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
6cc0: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
6cd0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
6ce0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
6cf0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6d00: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
6d10: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
6d20: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
6d30: 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20  Bt;.  int hdr = 
6d40: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6d50: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a  ;.  int first;..
6d60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6d70: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
6d80: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
6d90: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
6da0: 0a 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61  .  assert( &data
6db0: 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  [pBt->pageSize] 
6dc0: 3d 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  == (unsigned cha
6dd0: 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r*)pPage );.  as
6de0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
6df0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
6e00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
6e10: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
6e20: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
6e30: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
6e40: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 66  .  data[hdr] = f
6e50: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
6e60: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
6e70: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
6e80: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
6e90: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
6ea0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
6eb0: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
6ec0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
6ed0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
6ee0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
6ef0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
6f00: 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64  - first;.  decod
6f10: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
6f20: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68  ags);.  pPage->h
6f30: 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a  drOffset = hdr;.
6f40: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
6f50: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
6f60: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
6f70: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 0;.  pPage->id
6f80: 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50  xShift = 0;.  pP
6f90: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
6fa0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
6fb0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 1;.}../*.** Ge
6fc0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
6fd0: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
6fe0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
6ff0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
7000: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
7010: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
7020: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
7030: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
7040: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
7050: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
7060: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
7070: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
7080: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
7090: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
70a0: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
70b0: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
70c0: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
70d0: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
70e0: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
70f0: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
7100: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
7110: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
7120: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
7130: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
7140: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
7150: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
7160: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
7170: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
7180: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
7190: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
71a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
71b0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
71c0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
71d0: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
71e0: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
71f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7200: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
7210: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
7220: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
7230: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
7240: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
7250: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
7260: 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44  tent        /* D
7270: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
7280: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
7290: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
72a0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
72b0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
72c0: 61 67 65 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  age;..  rc = sql
72d0: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
72e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
72f0: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
7300: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
7310: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
7320: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
7330: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
7340: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
7350: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
7360: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
7370: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7380: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
7390: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
73a0: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
73b0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
73c0: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
73d0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
73e0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
73f0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
7400: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  ;.  *ppPage = pP
7410: 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
7420: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7430: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
7440: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
7450: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
7460: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
7470: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
7480: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
7490: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
74a0: 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
74b0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
74c0: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
74d0: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  InitPage()..*/.s
74e0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
74f0: 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
7500: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
7510: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
7520: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
7530: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
7540: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7550: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
7560: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
7570: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
7580: 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
7590: 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65  ter here */.  Me
75a0: 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20  mPage *pParent  
75b0: 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20     /* Parent of 
75c0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  the page */.){. 
75d0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
75e0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
75f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7600: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20  UPT_BKPT; .  }. 
7610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
7620: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
7630: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
7640: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7650: 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65  E_OK && (*ppPage
7660: 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
7670: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7680: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  BtreeInitPage(*p
7690: 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
76a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
76b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
76c0: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
76d0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
76e0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
76f0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
7700: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
7710: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
7720: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
7730: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
7740: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
7750: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7760: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
7770: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
7780: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
7790: 73 65 72 74 28 20 26 70 50 61 67 65 2d 3e 61 44  sert( &pPage->aD
77a0: 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata[pPage->pBt->
77b0: 70 61 67 65 53 69 7a 65 5d 3d 3d 28 75 6e 73 69  pageSize]==(unsi
77c0: 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65  gned char*)pPage
77d0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
77e0: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
77f0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
7800: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7810: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
7820: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
7830: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
7840: 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65  ge.** reaches ze
7850: 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  ro.  We need to 
7860: 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e  unref the pParen
7870: 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74  t pointer when t
7880: 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a  hat.** happens..
7890: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
78a0: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62  ageDestructor(Db
78b0: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
78c0: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
78d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
78e0: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
78f0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
7900: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
7910: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7920: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
7930: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
7940: 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  ent ){.    MemPa
7950: 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50  ge *pParent = pP
7960: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
7970: 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
7980: 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
7990: 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a  ePage(pParent);.
79a0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49    }.  pPage->isI
79b0: 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  nit = 0;.}../*.*
79c0: 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
79d0: 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
79e0: 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
79f0: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
7a00: 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
7a10: 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
7a20: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
7a30: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
7a40: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
7a50: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7a60: 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
7a70: 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
7a80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
7a90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7aa0: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
7ab0: 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
7ac0: 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
7ad0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
7ae0: 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
7af0: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
7b00: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
7b10: 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
7b20: 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e  bPage *pData, in
7b30: 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d  t pageSize){.  M
7b40: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
7b50: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
7b60: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
7b70: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
7b80: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
7b90: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
7ba0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
7bb0: 6e 69 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nit ){.    pPage
7bc0: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
7bd0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
7be0: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
7bf0: 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
7c00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
7c10: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
7c20: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
7c30: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
7c40: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7c50: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
7c60: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20  me is NULL.** a 
7c70: 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74  new database wit
7c80: 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20  h a random name 
7c90: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69  is created.  Thi
7ca0: 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64  s randomly named
7cb0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
7cc0: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
7cd0: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  d when sqlite3Bt
7ce0: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
7cf0: 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lled..*/.int sql
7d00: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
7d10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
7d20: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
7d30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
7d40: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
7d50: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
7d60: 73 71 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65  sqlite3 *pSqlite
7d70: 2c 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63  ,       /* Assoc
7d80: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
7d90: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
7da0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
7db0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7dc0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
7dd0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
7de0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7e00: 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42  ptions */.){.  B
7e10: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
7e20: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
7e30: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
7e40: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
7e50: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
7e60: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
7e70: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
7e80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7e90: 4b 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76  K;.  int nReserv
7ea0: 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
7eb0: 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
7ec0: 5d 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ];.#if !defined(
7ed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
7ee0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
7ef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7f00: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 63 6f 6e 73  T_DISKIO).  cons
7f10: 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54  t ThreadData *pT
7f20: 73 64 72 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  sdro;.#endif..  
7f30: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
7f40: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
7f50: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
7f60: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
7f70: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
7f80: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
7f90: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
7fa0: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
7fb0: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
7fc0: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
7fd0: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
7fe0: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
7ff0: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
8000: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
8010: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
8020: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8030: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
8040: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
8050: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
8060: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
8070: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
8080: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
8090: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
80a0: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
80b0: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
80c0: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
80d0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
80e0: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
80f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 70 20 3d  if.#endif..  p =
8100: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
8110: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
8120: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
8130: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8140: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
8150: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
8160: 3b 0a 20 20 70 2d 3e 70 53 71 6c 69 74 65 20 3d  ;.  p->pSqlite =
8170: 20 70 53 71 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20   pSqlite;..  /* 
8180: 54 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 20 65  Try to find an e
8190: 78 69 73 74 69 6e 67 20 42 74 72 65 65 20 73 74  xisting Btree st
81a0: 72 75 63 74 75 72 65 20 6f 70 65 6e 65 64 20 6f  ructure opened o
81b0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  n zFilename. */.
81c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
81d0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
81e0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
81f0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
8200: 49 53 4b 49 4f 29 0a 20 20 70 54 73 64 72 6f 20  ISKIO).  pTsdro 
8210: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
8220: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
8230: 20 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65   if( pTsdro->use
8240: 53 68 61 72 65 64 44 61 74 61 20 26 26 20 7a 46  SharedData && zF
8250: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
8260: 6d 64 62 20 29 7b 0a 20 20 20 20 63 68 61 72 20  mdb ){.    char 
8270: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
8280: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
8290: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
82a0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 75 6c  );.    if( !zFul
82b0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
82c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29     sqliteFree(p)
82d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
82e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
82f0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 70   }.    for(pBt=p
8300: 54 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b 20 70  Tsdro->pBtree; p
8310: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
8320: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
8330: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
8340: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
8350: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
8360: 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
8370: 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
8380: 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20 20  Pager)) ){.     
8390: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
83a0: 0a 20 20 20 20 20 20 20 20 2a 70 70 42 74 72 65  .        *ppBtre
83b0: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  e = p;.        p
83c0: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
83d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
83e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
83f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8400: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
8410: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8420: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
8430: 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
8440: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
8450: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
8460: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
8470: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
8480: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
8490: 65 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74  e.  ** the right
84a0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
84b0: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
84c0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
84d0: 61 74 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77  at result.  ** w
84e0: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
84f0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
8500: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  hitecture..  */.
8510: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
8520: 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
8530: 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
8540: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
8550: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
8560: 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (u64)==4 );.  as
8570: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
8580: 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  )==4 );.  assert
8590: 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
85a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
85b0: 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
85c0: 0a 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  ..  pBt = sqlite
85d0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
85e0: 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 70 42  pBt) );.  if( pB
85f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
8600: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8610: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
8620: 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  en_out;.  }.  rc
8630: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
8640: 70 65 6e 28 26 70 42 74 2d 3e 70 50 61 67 65 72  pen(&pBt->pPager
8650: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54  , zFilename, EXT
8660: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b  RA_SIZE, flags);
8670: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8680: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8690: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
86a0: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
86b0: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
86c0: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
86d0: 64 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  der);.  }.  if( 
86e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
86f0: 0a 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f  .    goto btree_
8700: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  open_out;.  }.  
8710: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 0a 20  p->pBt = pBt;.. 
8720: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
8730: 44 65 73 74 72 75 63 74 6f 72 28 70 42 74 2d 3e  Destructor(pBt->
8740: 70 50 61 67 65 72 2c 20 70 61 67 65 44 65 73 74  pPager, pageDest
8750: 72 75 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74  ructor);.  sqlit
8760: 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
8770: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
8780: 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 70  pageReinit);.  p
8790: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
87a0: 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
87b0: 20 30 3b 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f   0;.  pBt->readO
87c0: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
87d0: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
87e0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74  ->pPager);.  pBt
87f0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74  ->pageSize = get
8800: 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  2byte(&zDbHeader
8810: 5b 31 36 5d 29 3b 0a 20 20 69 66 28 20 70 42 74  [16]);.  if( pBt
8820: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
8830: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
8840: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
8850: 53 49 5a 45 0a 20 20 20 20 20 20 20 7c 7c 20 28  SIZE.       || (
8860: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
8870: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
8880: 21 3d 30 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  !=0 ){.    pBt->
8890: 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54  pageSize = SQLIT
88a0: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
88b0: 49 5a 45 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  IZE;.    pBt->ma
88c0: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 36 34 3b  xEmbedFrac = 64;
88d0: 20 20 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20 20     /* 25% */.   
88e0: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
88f0: 61 63 20 3d 20 33 32 3b 20 20 20 2f 2a 20 31 32  ac = 32;   /* 12
8900: 2e 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  .5% */.    pBt->
8910: 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32  minLeafFrac = 32
8920: 3b 20 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f  ;    /* 12.5% */
8930: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8940: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
8950: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
8960: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
8970: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
8980: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
8990: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
89a0: 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
89b0: 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
89c0: 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
89d0: 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
89e0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
89f0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
8a00: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
8a10: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
8a20: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
8a30: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
8a40: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
8a50: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
8a60: 20 6a 75 73 74 20 61 0a 20 20 20 20 2a 2a 20 72   just a.    ** r
8a70: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
8a80: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
8a90: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
8aa0: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
8ab0: 72 6d 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmal..    */.   
8ac0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
8ad0: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
8ae0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
8af0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
8b00: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
8b10: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
8b20: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
8b30: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
8b40: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
8b50: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d   ? 1 : 0);.    }
8b60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 52 65 73  .#endif.    nRes
8b70: 65 72 76 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erve = 0;.  }els
8b80: 65 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  e{.    nReserve 
8b90: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
8ba0: 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62  .    pBt->maxEmb
8bb0: 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64  edFrac = zDbHead
8bc0: 65 72 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d  er[21];.    pBt-
8bd0: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
8be0: 7a 44 62 48 65 61 64 65 72 5b 32 32 5d 3b 0a 20  zDbHeader[22];. 
8bf0: 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46     pBt->minLeafF
8c00: 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rac = zDbHeader[
8c10: 32 33 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  23];.    pBt->pa
8c20: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
8c30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8c40: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
8c50: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
8c60: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
8c70: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
8c80: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  4*4])?1:0);.#end
8c90: 69 66 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73  if.  }.  pBt->us
8ca0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
8cb0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
8cc0: 72 76 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28  rve;.  assert( (
8cd0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
8ce0: 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
8cf0: 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
8d00: 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 73   pageSize */.  s
8d10: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
8d20: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
8d30: 65 72 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  er, pBt->pageSiz
8d40: 65 29 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  e);..#if !define
8d50: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
8d60: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
8d70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8d80: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
8d90: 20 41 64 64 20 74 68 65 20 6e 65 77 20 62 74 72   Add the new btr
8da0: 65 65 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ee to the linked
8db0: 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
8dc0: 74 20 54 68 72 65 61 64 44 61 74 61 2e 70 42 74  t ThreadData.pBt
8dd0: 72 65 65 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  ree..  ** There 
8de0: 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
8df0: 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79  t a malloc() may
8e00: 20 66 61 69 6c 20 69 6e 73 69 64 65 20 6f 66 20   fail inside of 
8e10: 74 68 65 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65  the .  ** sqlite
8e20: 33 54 68 72 65 61 64 44 61 74 61 28 29 20 63 61  3ThreadData() ca
8e30: 6c 6c 2c 20 61 73 20 74 68 65 20 54 68 72 65 61  ll, as the Threa
8e40: 64 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  dData structure 
8e50: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
8e60: 79 0a 20 20 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  y.  ** been allo
8e70: 63 61 74 65 64 20 66 6f 72 20 70 54 73 64 72 6f  cated for pTsdro
8e80: 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
8e90: 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  to be non-zero..
8ea0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 73 64 72    */.  if( pTsdr
8eb0: 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  o->useSharedData
8ec0: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26   && zFilename &&
8ed0: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
8ee0: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 70 54   pBt->pNext = pT
8ef0: 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b 0a 20 20  sdro->pBtree;.  
8f00: 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44    sqlite3ThreadD
8f10: 61 74 61 28 29 2d 3e 70 42 74 72 65 65 20 3d 20  ata()->pBtree = 
8f20: 70 42 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  pBt;.  }.#endif.
8f30: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
8f40: 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
8f50: 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
8f60: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
8f70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
8f80: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
8f90: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
8fa0: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
8fb0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
8fc0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
8fd0: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
8fe0: 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  teFree(p);.    *
8ff0: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
9000: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9010: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
9020: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
9030: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
9040: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
9050: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
9060: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
9070: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
9080: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
9090: 6f 72 20 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64  or *pCur;..#ifnd
90a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
90b0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 54 68  HARED_CACHE.  Th
90c0: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a  readData *pTsd;.
90d0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f  #endif..  /* Clo
90e0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
90f0: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
9100: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75  andle.  */.  pCu
9110: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
9120: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
9130: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
9140: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
9150: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
9160: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
9170: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
9180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
9190: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
91a0: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
91b0: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
91c0: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
91d0: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
91e0: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
91f0: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
9200: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
9210: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
9220: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
9230: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
9240: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
9250: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
9260: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
9270: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 0a 23  qliteFree(p);..#
9280: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9290: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
92a0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
92b0: 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
92c0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
92d0: 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
92e0: 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
92f0: 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
9300: 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
9310: 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
9320: 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
9330: 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
9340: 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
9350: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
9360: 30 20 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  0 );.  pBt->nRef
9370: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
9380: 52 65 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Ref ){.    retur
9390: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
93a0: 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
93b0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 66  e shared-btree f
93c0: 72 6f 6d 20 74 68 65 20 74 68 72 65 61 64 20 77  rom the thread w
93d0: 69 64 65 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a  ide list. Call .
93e0: 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 52    ** ThreadDataR
93f0: 65 61 64 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68  eadOnly() and th
9400: 65 6e 20 63 61 73 74 20 61 77 61 79 20 74 68 65  en cast away the
9410: 20 63 6f 6e 73 74 20 70 72 6f 70 65 72 74 79 20   const property 
9420: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69  of the .  ** poi
9430: 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 61 6c  nter to avoid al
9440: 6c 6f 63 61 74 69 6e 67 20 74 68 72 65 61 64 20  locating thread 
9450: 64 61 74 61 20 69 66 20 69 74 20 69 73 20 6e 6f  data if it is no
9460: 74 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  t really require
9470: 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d  d..  */.  pTsd =
9480: 20 28 54 68 72 65 61 64 44 61 74 61 20 2a 29 73   (ThreadData *)s
9490: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
94a0: 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66  ReadOnly();.  if
94b0: 28 20 70 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d  ( pTsd->pBtree==
94c0: 70 42 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pBt ){.    asser
94d0: 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33  t( pTsd==sqlite3
94e0: 54 68 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a  ThreadData() );.
94f0: 20 20 20 20 70 54 73 64 2d 3e 70 42 74 72 65 65      pTsd->pBtree
9500: 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
9510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42 74 53 68   }else{.    BtSh
9520: 61 72 65 64 20 2a 70 50 72 65 76 3b 0a 20 20 20  ared *pPrev;.   
9530: 20 66 6f 72 28 70 50 72 65 76 3d 70 54 73 64 2d   for(pPrev=pTsd-
9540: 3e 70 42 74 72 65 65 3b 20 70 50 72 65 76 20 26  >pBtree; pPrev &
9550: 26 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d  & pPrev->pNext!=
9560: 70 42 74 3b 20 70 50 72 65 76 3d 70 50 72 65 76  pBt; pPrev=pPrev
9570: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69  ->pNext){}.    i
9580: 66 28 20 70 50 72 65 76 20 29 7b 0a 20 20 20 20  f( pPrev ){.    
9590: 20 20 61 73 73 65 72 74 28 20 70 54 73 64 3d 3d    assert( pTsd==
95a0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
95b0: 61 28 29 20 29 3b 0a 20 20 20 20 20 20 70 50 72  a() );.      pPr
95c0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ev->pNext = pBt-
95d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
95e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
95f0: 6c 6f 73 65 20 74 68 65 20 70 61 67 65 72 20 61  lose the pager a
9600: 6e 64 20 66 72 65 65 20 74 68 65 20 73 68 61 72  nd free the shar
9610: 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
9620: 72 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  re */.  assert( 
9630: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
9640: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  .  sqlite3PagerC
9650: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
9660: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 78 46  );.  if( pBt->xF
9670: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
9680: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
9690: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
96a0: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
96b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
96c0: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
96d0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42  .  sqliteFree(pB
96e0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
96f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9700: 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73 79   Change the busy
9710: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
9720: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  k function..*/.i
9730: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
9740: 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74  etBusyHandler(Bt
9750: 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e 64  ree *p, BusyHand
9760: 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a  ler *pHandler){.
9770: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
9780: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d  = p->pBt;.  pBt-
9790: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
97a0: 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69  pHandler;.  sqli
97b0: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
97c0: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
97d0: 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20  er, pHandler);. 
97e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
97f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
9800: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
9810: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
9820: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
9830: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
9840: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
9850: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
9860: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
9870: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
9880: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
9890: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
98a0: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
98b0: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
98c0: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
98d0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
98e0: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
98f0: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
9900: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
9910: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
9920: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
9930: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
9940: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
9950: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
9960: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
9970: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
9980: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
9990: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
99a0: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
99b0: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
99c0: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
99d0: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
99e0: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
99f0: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
9a00: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
9a10: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
9a20: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
9a30: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
9a40: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
9a50: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
9a60: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
9a70: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
9a80: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
9a90: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
9aa0: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
9ab0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
9ac0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
9ad0: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
9ae0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
9af0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
9b00: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
9b10: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
9b20: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
9b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9b40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
9b50: 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
9b60: 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
9b70: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
9b80: 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
9b90: 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
9ba0: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
9bb0: 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
9bc0: 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
9bd0: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
9be0: 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
9bf0: 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
9c00: 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
9c10: 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
9c20: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
9c30: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
9c40: 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
9c50: 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
9c60: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
9c70: 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
9c80: 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
9c90: 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
9ca0: 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
9cb0: 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
9cc0: 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
9cd0: 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
9ce0: 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
9cf0: 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
9d00: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
9d10: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
9d20: 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
9d30: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
9d40: 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
9d50: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
9d60: 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
9d70: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
9d80: 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
9d90: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
9da0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
9db0: 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
9dc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9dd0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
9de0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
9df0: 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
9e00: 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
9e10: 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
9e20: 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
9e30: 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
9e40: 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
9e50: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
9e60: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9e70: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
9e80: 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
9e90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
9ea0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
9eb0: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
9ec0: 61 67 65 72 20 29 3b 0a 20 20 72 65 74 75 72 6e  ager );.  return
9ed0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
9ee0: 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
9ef0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
9f00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
9f10: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
9f20: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9f30: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
9f40: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
9f50: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
9f60: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
9f70: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
9f80: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s per page..**.*
9f90: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
9fa0: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
9fb0: 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
9fc0: 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
9fd0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
9fe0: 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
9ff0: 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
a000: 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
a010: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
a020: 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
a030: 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
a040: 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
a050: 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
a060: 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
a070: 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
a080: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
a090: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
a0a0: 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
a0b0: 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
a0c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
a0d0: 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
a0e0: 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
a0f0: 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
a100: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
a110: 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
a120: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
a130: 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
a140: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
a150: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
a160: 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
a170: 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
a180: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
a190: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
a1a0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
a1b0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
a1c0: 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
a1d0: 76 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ve){.  BtShared 
a1e0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
a1f0: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
a200: 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72  zeFixed ){.    r
a210: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
a220: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
a230: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
a240: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
a250: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
a260: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
a270: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
a280: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
a290: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
a2a0: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
a2b0: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
a2c0: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
a2d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
a2e0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
a2f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
a300: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
a310: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
a320: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
a330: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
a340: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
a350: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a  >pPager, pageSiz
a360: 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75  e);.  }.  pBt->u
a370: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
a380: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
a390: 65 72 76 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  erve;.  return S
a3a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a3b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
a3c0: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
a3d0: 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
a3e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
a3f0: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
a400: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
a410: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
a420: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
a430: 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65  eGetReserve(Btre
a440: 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
a450: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
a460: 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
a470: 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
a480: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
a490: 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
a4a0: 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
a4b0: 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
a4c0: 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
a4d0: 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
a4e0: 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
a4f0: 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
a500: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
a510: 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
a520: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
a530: 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
a540: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
a550: 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
a560: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
a570: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
a580: 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
a590: 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
a5a0: 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 23 65 6e  , mxPage);.}.#en
a5b0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
a5c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
a5d0: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
a5e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a5f0: 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
a600: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
a610: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
a620: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
a630: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
a640: 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
a650: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
a660: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
a670: 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
a680: 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
a690: 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
a6a0: 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
a6b0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
a6c0: 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
a6d0: 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
a6e0: 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
a6f0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
a700: 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
a710: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
a720: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
a730: 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
a740: 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
a750: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
a760: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
a770: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
a780: 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
a790: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
a7a0: 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74  .  int av = (aut
a7b0: 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20  oVacuum?1:0);.  
a7c0: 69 6e 74 20 69 76 20 3d 20 28 61 75 74 6f 56 61  int iv = (autoVa
a7d0: 63 75 75 6d 3d 3d 42 54 52 45 45 5f 41 55 54 4f  cuum==BTREE_AUTO
a7e0: 56 41 43 55 55 4d 5f 49 4e 43 52 3f 31 3a 30 29  VACUUM_INCR?1:0)
a7f0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
a800: 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 61 76  eSizeFixed && av
a810: 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
a820: 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  m ){.    return 
a830: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
a840: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f  .  }.  pBt->auto
a850: 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 70  Vacuum = av;.  p
a860: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
a870: 20 69 76 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   iv;.  return SQ
a880: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
a890: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a8a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
a8b0: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
a8c0: 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
a8d0: 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
a8e0: 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
a8f0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
a900: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
a910: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
a920: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
a930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
a940: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
a950: 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
a960: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
a970: 73 65 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20  se.  return (.  
a980: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
a990: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
a9a0: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
a9b0: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
a9c0: 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
a9d0: 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
a9e0: 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
a9f0: 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 23  CUUM_INCR.  );.#
aa00: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
aa10: 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
aa20: 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
aa30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
aa40: 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
aa50: 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
aa60: 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
aa70: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
aa80: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
aa90: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
aaa0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
aab0: 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
aac0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
aad0: 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
aae0: 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
aaf0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
ab00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
ab10: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
ab20: 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
ab30: 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
ab40: 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
ab50: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
ab60: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
ab70: 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
ab80: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  pBt){.  int rc, 
ab90: 70 61 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50  pageSize;.  MemP
aba0: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
abb0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
abc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
abd0: 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  K;.  rc = sqlite
abe0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
abf0: 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
ac00: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ac10: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
ac20: 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20  rc;.  ..  /* Do 
ac30: 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
ac40: 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
ac50: 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
ac60: 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
ac70: 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
ac80: 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63  file. .  */.  rc
ac90: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
aca0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50  ;.  if( sqlite3P
acb0: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
acc0: 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a  t->pPager)>0 ){.
acd0: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
ace0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
acf0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
ad00: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
ad10: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
ad20: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
ad30: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
ad40: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
ad50: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
ad60: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
ad70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ad80: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
ad90: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
ada0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
adb0: 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
adc0: 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
add0: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
ade0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
adf0: 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67  eSize)!=0 || pag
ae00: 65 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20  eSize<512 ){.   
ae10: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
ae20: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
ae30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
ae40: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
ae50: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
ae60: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
ae70: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
ae80: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
ae90: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
aea0: 69 66 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  if( pBt->usableS
aeb0: 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20  ize<500 ){.     
aec0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
aed0: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
aee0: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
aef0: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d  Frac = page1[21]
af00: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d  ;.    pBt->minEm
af10: 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b  bedFrac = page1[
af20: 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  22];.    pBt->mi
af30: 6e 4c 65 61 66 46 72 61 63 20 3d 20 70 61 67 65  nLeafFrac = page
af40: 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53  1[23];.#ifndef S
af50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
af60: 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
af70: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
af80: 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
af90: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 4*4])?1:0);.#e
afa0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
afb0: 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
afc0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
afd0: 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
afe0: 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
aff0: 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
b000: 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
b010: 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
b020: 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
b030: 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
b040: 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
b050: 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
b060: 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
b070: 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
b080: 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
b090: 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
b0a0: 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
b0b0: 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
b0c0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
b0d0: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
b0e0: 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
b0f0: 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
b100: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
b110: 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
b120: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
b130: 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
b140: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
b150: 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
b160: 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
b170: 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ner, a header wh
b180: 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
b190: 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
b1a0: 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
b1b0: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
b1c0: 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
b1d0: 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
b1e0: 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
b1f0: 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
b200: 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  xLocal = (pBt->u
b210: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42  sableSize-12)*pB
b220: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f  t->maxEmbedFrac/
b230: 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
b240: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
b250: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
b260: 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72  *pBt->minEmbedFr
b270: 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  ac/255 - 23;.  p
b280: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
b290: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
b2a0: 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
b2b0: 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
b2c0: 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d  eSize-12)*pBt->m
b2d0: 69 6e 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d  inLeafFrac/255 -
b2e0: 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e   23;.  if( pBt->
b2f0: 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61  minLocal>pBt->ma
b300: 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d  xLocal || pBt->m
b310: 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20  axLocal<0 ){.   
b320: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
b330: 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61  _failed;.  }.  a
b340: 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
b350: 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
b360: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
b370: 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
b380: 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72   pPage1;.  retur
b390: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
b3a0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
b3b0: 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
b3c0: 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
b3d0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
b3e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b3f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
b400: 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72  rks like lockBtr
b410: 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  ee() except that
b420: 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73   it also invokes
b430: 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c   the.** busy cal
b440: 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69  lback if there i
b450: 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  s lock contentio
b460: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b470: 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
b480: 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29  try(Btree *pRef)
b490: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b4a0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52  ITE_OK;.  if( pR
b4b0: 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  ef->inTrans==TRA
b4c0: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75  NS_NONE ){.    u
b4d0: 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  8 inTransaction 
b4e0: 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54  = pRef->pBt->inT
b4f0: 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
b500: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
b510: 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Ref);.    rc = s
b520: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
b530: 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a  Trans(pRef, 0);.
b540: 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69      pRef->pBt->i
b550: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69  nTransaction = i
b560: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
b570: 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20    pRef->inTrans 
b580: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
b590: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b5a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65  _OK ){.      pRe
b5b0: 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  f->pBt->nTransac
b5c0: 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  tion--;.    }.  
b5d0: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
b5e0: 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (pRef);.  }.  re
b5f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20  turn rc;.}.     
b600: 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65    ../*.** If the
b610: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
b620: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
b630: 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
b640: 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
b650: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
b660: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
b670: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
b680: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
b690: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
b6a0: 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
b6b0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
b6c0: 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
b6d0: 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
b6e0: 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
b6f0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
b700: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
b710: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
b720: 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72   cursors, this r
b730: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
b740: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  p..**.** If ther
b750: 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
b760: 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
b770: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b780: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
b790: 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
b7a0: 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
b7b0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
b7c0: 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
b7d0: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
b7e0: 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72   && pBt->pCursor
b7f0: 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ==0 && pBt->pPag
b800: 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  e1!=0 ){.    if(
b810: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
b820: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
b830: 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  r)>=1 ){.      i
b840: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  f( pBt->pPage1->
b850: 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
b860: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
b870: 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  ge = pBt->pPage1
b880: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
b890: 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
b8a0: 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67  pPage)[-pBt->pag
b8b0: 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  eSize];.        
b8c0: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
b8d0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
b8e0: 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20  >pgno = 1;.     
b8f0: 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
b900: 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
b910: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  );.    }.    pBt
b920: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
b930: 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
b940: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
b950: 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
b960: 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
b970: 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
b980: 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
b990: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
b9a0: 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
b9b0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
b9c0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
b9d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b9e0: 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
b9f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
ba00: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
ba10: 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65 74  >pPager)>0 ) ret
ba20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ba30: 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
ba40: 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
ba50: 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
ba60: 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
ba70: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ba80: 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
ba90: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
baa0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
bab0: 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
bac0: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
bad0: 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
bae0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
baf0: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
bb00: 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
bb10: 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
bb20: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
bb30: 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
bb40: 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[19] = 1;.  dat
bb50: 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67  a[20] = pBt->pag
bb60: 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
bb70: 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b  bleSize;.  data[
bb80: 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d  21] = pBt->maxEm
bb90: 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
bba0: 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d  22] = pBt->minEm
bbb0: 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
bbc0: 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  23] = pBt->minLe
bbd0: 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74  afFrac;.  memset
bbe0: 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
bbf0: 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
bc00: 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
bc10: 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
bc20: 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
bc30: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
bc40: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
bc50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
bc60: 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
bc70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
bc80: 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
bc90: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
bca0: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
bcb0: 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
bcc0: 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
bcd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bce0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  OK;.}../*.** Att
bcf0: 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
bd00: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
bd10: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
bd20: 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
bd30: 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
bd40: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
bd50: 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
bd60: 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
bd70: 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
bd80: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
bd90: 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
bda0: 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
bdb0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
bdc0: 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
bdd0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
bde0: 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
bdf0: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
be00: 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
be10: 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
be20: 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
be30: 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
be40: 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
be50: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
be60: 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
be70: 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
be80: 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
be90: 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
bea0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
beb0: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
bec0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
bed0: 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
bee0: 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
bef0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
bf00: 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
bf10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
bf20: 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
bf30: 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
bf40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
bf50: 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
bf60: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
bf70: 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
bf80: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
bf90: 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
bfa0: 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
bfb0: 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
bfc0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
bfd0: 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
bfe0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
bff0: 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
c000: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
c010: 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
c020: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
c030: 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
c040: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
c050: 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
c060: 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
c070: 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
c080: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
c090: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
c0a0: 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
c0b0: 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
c0c0: 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
c0d0: 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
c0e0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
c0f0: 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
c100: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
c110: 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
c120: 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
c130: 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
c140: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
c150: 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
c160: 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
c170: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
c180: 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
c190: 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
c1a0: 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
c1b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
c1c0: 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
c1d0: 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
c1e0: 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
c1f0: 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
c200: 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
c210: 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
c220: 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
c230: 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
c240: 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
c250: 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
c260: 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
c270: 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
c280: 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
c290: 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
c2a0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
c2b0: 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
c2c0: 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
c2d0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
c2e0: 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
c2f0: 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
c300: 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
c310: 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
c320: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
c330: 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
c340: 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
c350: 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
c360: 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
c370: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
c380: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
c390: 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
c3a0: 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
c3b0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c3c0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
c3d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c3e0: 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
c3f0: 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
c400: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
c410: 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
c420: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
c430: 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
c440: 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
c450: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
c460: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
c470: 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
c480: 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
c490: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
c4a0: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
c4b0: 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
c4c0: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
c4d0: 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
c4e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c4f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
c500: 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
c510: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
c520: 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
c530: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
c540: 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
c550: 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
c560: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c570: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
c580: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  ..  /* If anothe
c590: 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
c5a0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
c5b0: 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
c5c0: 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
c5d0: 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
c5e0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
c5f0: 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
c600: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
c610: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
c620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
c630: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  SY..  */.  if( p
c640: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
c650: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
c660: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
c670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
c680: 53 59 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a  SY;.  }..  do {.
c690: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
c6a0: 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge1==0 ){.      
c6b0: 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
c6c0: 42 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Bt);.    }..    
c6d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c6e0: 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
c6f0: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
c700: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
c710: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
c720: 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
c730: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
c740: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
c750: 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  gin(pBt->pPage1-
c760: 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67  >pDbPage, wrflag
c770: 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >1);.        if(
c780: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c790: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
c7a0: 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
c7b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c7c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
c7d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c7e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
c7f0: 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69   wrflag ) pBt->i
c800: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
c810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  else{.      unlo
c820: 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
c830: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
c840: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
c850: 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
c860: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
c870: 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
c880: 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 76 6f       sqlite3Invo
c890: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
c8a0: 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  t->pBusyHandler)
c8b0: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
c8c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c8d0: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
c8e0: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
c8f0: 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
c900: 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ction++;.    }. 
c910: 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
c920: 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
c930: 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
c940: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
c950: 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
c960: 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
c970: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
c980: 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
c990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74  .    }.  }..  bt
c9a0: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
c9b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c9c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c9d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
c9e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
c9f0: 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
ca00: 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
ca10: 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
ca20: 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
ca30: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
ca40: 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
ca50: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
ca60: 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
ca70: 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
ca80: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
ca90: 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
caa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
cab0: 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
cac0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
cad0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
cb00: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
cb10: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
cb40: 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
cb50: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
cb80: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
cb90: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
cba0: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
cbb0: 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
cbc0: 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
cbd0: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
cbe0: 3e 70 67 6e 6f 3b 0a 0a 20 20 72 63 20 3d 20 73  >pgno;..  rc = s
cbf0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
cc00: 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
cc10: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  ->pParent);.  if
cc20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cc30: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
cc40: 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
cc50: 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
cc60: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
cc70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
cc80: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
cc90: 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
cca0: 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
ccb0: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
ccc0: 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
ccd0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
cce0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ccf0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  .      goto set_
cd00: 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
cd10: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
cd20: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
cd30: 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
cd40: 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
cd50: 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
cd60: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
cd70: 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
cd80: 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
cd90: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
cda0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
cdb0: 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
cdc0: 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
cdd0: 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
cde0: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
cdf0: 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
ce00: 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
ce10: 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
ce20: 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
ce30: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
ce40: 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
ce50: 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
ce60: 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  no);.  }..set_ch
ce70: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
ce80: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
ce90: 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
cea0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ceb0: 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
cec0: 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69  n pPage, which i
ced0: 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
cee0: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c  be a btree page,
cef0: 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77   not an overflow
cf00: 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70  .** page, is a p
cf10: 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
cf20: 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69  From. Modify thi
cf30: 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61  s pointer so tha
cf40: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
cf50: 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  * iTo. Parameter
cf60: 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
cf70: 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
cf80: 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66  nter to be modif
cf90: 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c  ied, as .** foll
cfa0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
cfb0: 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
cfc0: 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
cfd0: 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
cfe0: 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
cff0: 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
d000: 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
d010: 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
d020: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
d030: 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
d040: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
d050: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
d060: 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
d080: 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
d090: 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
d0a0: 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
d0b0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
d0c0: 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
d0d0: 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
d0e0: 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
d0f0: 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d110: 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
d120: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
d130: 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
d140: 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
d150: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
d160: 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
d170: 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
d180: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
d190: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
d1a0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
d1b0: 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
d1c0: 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
d1d0: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
d1e0: 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
d1f0: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
d200: 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
d210: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
d220: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d230: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
d240: 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
d250: 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
d260: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
d270: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
d280: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
d290: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
d2a0: 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ell;..    sqlite
d2b0: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
d2c0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43  Page, 0);.    nC
d2d0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
d2e0: 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
d2f0: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
d300: 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
d310: 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
d320: 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
d330: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
d340: 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
d350: 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
d360: 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o;.        sqlit
d370: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
d380: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
d390: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
d3a0: 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
d3b0: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
d3c0: 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
d3d0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
d3e0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b  o.iOverflow]) ){
d3f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
d400: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
d410: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
d420: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
d430: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
d440: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d450: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d460: 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
d470: 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
d480: 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
d490: 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
d4a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d4b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d4c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
d4d0: 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
d4e0: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
d4f0: 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
d500: 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
d510: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
d520: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
d530: 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
d540: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d550: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d560: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
d570: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
d580: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
d590: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
d5a0: 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
d5b0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
d5c0: 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
d5d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d5e0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
d5f0: 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
d600: 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
d610: 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
d620: 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
d630: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
d640: 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
d650: 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
d660: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d670: 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
d680: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
d690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
d6a0: 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
d6b0: 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
d6c0: 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
d6d0: 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
d6e0: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
d6f0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
d700: 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
d710: 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
d720: 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
d730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
d740: 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
d750: 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
d760: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
d770: 46 72 65 65 50 61 67 65 20 20 20 20 20 20 20 20  FreePage        
d780: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
d790: 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
d7a0: 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ge to */.){.  Me
d7b0: 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
d7c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
d7d0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
d7e0: 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
d7f0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
d800: 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
d810: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
d820: 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
d830: 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
d840: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
d850: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
d860: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
d870: 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
d880: 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
d890: 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
d8a0: 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
d8b0: 41 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  AGE );..  /* Mov
d8c0: 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
d8d0: 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e 74  rom it's current
d8e0: 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
d8f0: 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
d900: 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
d910: 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
d920: 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
d930: 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
d940: 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
d950: 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
d960: 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
d970: 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
d980: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
d990: 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
d9a0: 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
d9b0: 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a  ge, iFreePage);.
d9c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d9d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
d9e0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
d9f0: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
da00: 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
da10: 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
da20: 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
da30: 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
da40: 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
da50: 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
da60: 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
da70: 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
da80: 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
da90: 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
daa0: 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
dab0: 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
dac0: 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
dad0: 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
dae0: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
daf0: 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
db00: 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
db10: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
db20: 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
db30: 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
db40: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
db50: 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
db60: 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
db70: 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
db80: 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
db90: 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
dba0: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
dbb0: 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
dbc0: 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
dbd0: 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
dbe0: 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
dbf0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
dc00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dc10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
dc20: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
dc30: 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
dc40: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
dc50: 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
dc60: 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
dc70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
dc80: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
dc90: 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
dca0: 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
dcb0: 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  eePage);.      i
dcc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dcd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
dce0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
dcf0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
dd00: 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
dd10: 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
dd20: 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
dd30: 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
dd40: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
dd50: 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
dd60: 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
dd70: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
dd80: 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
dd90: 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
dda0: 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
ddb0: 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
ddc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
ddd0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
dde0: 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
ddf0: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
de00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
de10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
de20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
de30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
de40: 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
de50: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
de60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
de70: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
de80: 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
de90: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dea0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
deb0: 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
dec0: 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
ded0: 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
dee0: 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
def0: 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
df00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
df10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
df20: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
df30: 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
df40: 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a  ype, iPtrPage);.
df50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
df60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
df70: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
df80: 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
df90: 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
dfa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
dfb0: 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
dfc0: 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
dfd0: 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
dfe0: 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
dff0: 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
e000: 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
e010: 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
e020: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
e030: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
e040: 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
e050: 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
e060: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
e070: 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
e080: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
e090: 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
e0a0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
e0b0: 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
e0c0: 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
e0d0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
e0e0: 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
e0f0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
e100: 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
e110: 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
e120: 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
e130: 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
e140: 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
e150: 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
e160: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
e170: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
e180: 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
e190: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
e1a0: 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
e1b0: 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
e1c0: 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
e1d0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
e1e0: 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
e1f0: 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
e200: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
e210: 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
e220: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
e230: 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
e240: 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
e250: 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61  complete..*/.sta
e260: 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
e270: 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
e280: 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29  *pBt, Pgno nFin)
e290: 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  {.  Pgno iLastPg
e2a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e2b0: 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   Last page in th
e2c0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
e2d0: 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
e2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e2f0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
e300: 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
e310: 69 73 74 20 2a 2f 0a 0a 20 20 69 4c 61 73 74 50  ist */..  iLastP
e320: 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b  g = pBt->nTrunc;
e330: 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d  .  if( iLastPg==
e340: 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67  0 ){.    iLastPg
e350: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
e360: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
e370: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
e380: 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
e390: 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
e3a0: 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
e3b0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
e3c0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ) ){.    int rc;
e3d0: 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
e3e0: 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
e3f0: 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
e400: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
e410: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
e420: 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
e430: 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46  reeList==0 || nF
e440: 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20  in==iLastPg ){. 
e450: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e460: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
e470: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
e480: 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
e490: 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
e4a0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
e4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e4c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e4d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
e4e0: 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
e4f0: 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
e500: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e510: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
e520: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
e530: 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
e540: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e  {.      if( nFin
e550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
e560: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
e570: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
e580: 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
e590: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
e5a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e  .        ** if n
e5b0: 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Fin is non-zero.
e5c0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
e5d0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
e5e0: 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
e5f0: 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
e600: 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
e610: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
e620: 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
e630: 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
e640: 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
e650: 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
e660: 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
e670: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
e680: 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
e690: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
e6a0: 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
e6b0: 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
e6c0: 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
e6d0: 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
e6e0: 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20  astPg, 1);.     
e6f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e700: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e710: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
e730: 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
e740: 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
e750: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
e760: 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
e770: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
e780: 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
e790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e7a0: 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
e7b0: 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
e7c0: 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
e7d0: 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
e7e0: 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
e7f0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
e800: 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
e810: 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
e820: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e830: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e850: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
e860: 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74   nFin is zero, t
e870: 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
e880: 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
e890: 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
e8a0: 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
e8b0: 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
e8c0: 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
e8d0: 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
e8e0: 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
e8f0: 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
e900: 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20  r hand, if nFin 
e910: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
e920: 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
e930: 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
e940: 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
e950: 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
e960: 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
e970: 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
e980: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
e990: 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
e9a0: 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
e9b0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
e9c0: 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
e9d0: 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
e9e0: 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
e9f0: 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30  , &iFreePg, 0, 0
ea00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ea10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ea20: 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
ea30: 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
ea40: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ea50: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
ea60: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
ea70: 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
ea80: 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21     }while( nFin!
ea90: 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  =0 && iFreePg>nF
eaa0: 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
eab0: 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
eac0: 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
ead0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eae0: 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74  PagerWrite(pLast
eaf0: 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
eb00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
eb10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
eb20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
eb30: 20 20 7d 20 0a 20 20 20 20 20 20 72 63 20 3d 20    } .      rc = 
eb40: 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
eb50: 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
eb60: 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
eb70: 65 50 67 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  ePg);.      rele
eb80: 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
eb90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
eba0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ebb0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ebc0: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20        } .    }. 
ebd0: 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e   }..  pBt->nTrun
ebe0: 63 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b  c = iLastPg - 1;
ebf0: 0a 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e  .  while( pBt->n
ec00: 54 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42  Trunc==PENDING_B
ec10: 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
ec20: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
ec30: 2c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29  , pBt->nTrunc) )
ec40: 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e  {.    pBt->nTrun
ec50: 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c--;.  }.  retur
ec60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ec70: 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
ec80: 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
ec90: 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
eca0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
ecb0: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
ecc0: 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
ecd0: 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
ece0: 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
ecf0: 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
ed00: 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
ed10: 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
ed20: 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
ed30: 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
ed40: 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
ed50: 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
ed60: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
ed70: 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
ed80: 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20  ror occured,.** 
ed90: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
eda0: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
edb0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
edc0: 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
edd0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
ede0: 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
edf0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ee00: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
ee10: 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
ee20: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
ee30: 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
ee40: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
ee50: 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
ee60: 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
ee70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
ee80: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 6e 76 61 6c  ONE;.  }.  inval
ee90: 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
eea0: 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 72 65  Cache(pBt);.  re
eeb0: 74 75 72 6e 20 69 6e 63 72 56 61 63 75 75 6d 53  turn incrVacuumS
eec0: 74 65 70 28 70 42 74 2c 20 30 29 3b 0a 7d 0a 0a  tep(pBt, 0);.}..
eed0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
eee0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
eef0: 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
ef00: 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
ef10: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
ef20: 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
ef30: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
ef40: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
ef50: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
ef60: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
ef70: 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
ef80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ef90: 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
efa0: 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
efb0: 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
efc0: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
efd0: 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
efe0: 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
eff0: 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
f000: 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
f010: 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
f020: 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
f030: 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
f040: 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
f050: 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
f060: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70  ed *pBt, Pgno *p
f070: 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
f080: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f090: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
f0a0: 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69   pBt->pPager;.#i
f0b0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
f0c0: 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
f0d0: 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
f0e0: 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  Pager);.#endif..
f0f0: 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
f100: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
f110: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
f120: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
f130: 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
f140: 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
f150: 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20   nFin = 0;..    
f160: 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d  if( pBt->nTrunc=
f170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  =0 ){.      Pgno
f180: 20 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 50 67   nFree;.      Pg
f190: 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20  no nPtrmap;.    
f1a0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
f1b0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
f1c0: 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4f 72  ;.      Pgno nOr
f1d0: 69 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ig = sqlite3Page
f1e0: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
f1f0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
f200: 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
f210: 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b  E(pBt, nOrig) ){
f220: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f240: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
f250: 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45     if( nOrig==PE
f260: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
f270: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
f280: 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d  nOrig--;.      }
f290: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67  .      nFree = g
f2a0: 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
f2b0: 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
f2c0: 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20  ;.      nPtrmap 
f2d0: 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
f2e0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
f2f0: 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29  , nOrig)+pgsz/5)
f300: 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20  /(pgsz/5);.     
f310: 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
f320: 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
f330: 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
f340: 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
f350: 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
f360: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
f370: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
f380: 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20     nFin--;.     
f390: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
f3a0: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
f3b0: 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
f3c0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
f3d0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
f3e0: 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
f3f0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77    }.    }..    w
f400: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f410: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
f420: 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
f430: 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  (pBt, nFin);.   
f440: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
f450: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
f460: 20 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d      assert(nFin=
f470: 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e  =0 || pBt->nTrun
f480: 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42  c==0 || nFin<=pB
f490: 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  t->nTrunc);.    
f4a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
f4b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
f4c0: 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20  >nTrunc ){.     
f4d0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57     sqlite3PagerW
f4e0: 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
f4f0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
f500: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
f510: 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
f520: 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
f530: 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
f540: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
f550: 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  6], 0);.        
f560: 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46  pBt->nTrunc = nF
f570: 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
f580: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
f590: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f5a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
f5b0: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
f5c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
f5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f5e0: 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20  .    *pnTrunc = 
f5f0: 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20  pBt->nTrunc;.   
f600: 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30   pBt->nTrunc = 0
f610: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f620: 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
f630: 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
f640: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
f650: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a  c;.}..#endif../*
f660: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f670: 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
f680: 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
f690: 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
f6a0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
f6b0: 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
f6c0: 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
f6d0: 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
f6e0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
f6f0: 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
f700: 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
f710: 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
f720: 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
f730: 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
f740: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
f750: 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
f760: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
f770: 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
f780: 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
f790: 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
f7a0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
f7b0: 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
f7c0: 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
f7d0: 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
f7e0: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
f7f0: 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
f800: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
f810: 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
f820: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
f830: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
f840: 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
f850: 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
f860: 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
f870: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
f880: 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
f890: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
f8a0: 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
f8b0: 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
f8c0: 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
f8d0: 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
f8e0: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
f8f0: 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
f900: 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20  ommit() for the 
f910: 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
f920: 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
f930: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
f940: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
f950: 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
f960: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
f970: 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
f980: 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
f990: 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
f9a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
f9b0: 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
f9c0: 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
f9d0: 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
f9e0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
f9f0: 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
fa00: 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
fa10: 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
fa20: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
fa30: 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
fa40: 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
fa50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fa60: 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
fa70: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
fa80: 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
fa90: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
faa0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fab0: 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
fac0: 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
fad0: 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
fae0: 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
faf0: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
fb00: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
fb10: 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
fb20: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
fb30: 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
fb40: 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
fb50: 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
fb60: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
fb70: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
fb80: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
fb90: 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
fba0: 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
fbb0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
fbc0: 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
fbd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
fbe0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
fbf0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
fc00: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
fc10: 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
fc20: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fc30: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67  = p->pBt;.    Pg
fc40: 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23  no nTrunc = 0;.#
fc50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fc60: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
fc70: 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
fc80: 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
fc90: 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
fca0: 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e  mmit(pBt, &nTrun
fcb0: 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72  c); .      if( r
fcc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fcd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
fce0: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
fcf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
fd00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
fd10: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
fd20: 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
fd30: 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 20  , nTrunc);.  }. 
fd40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fd50: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
fd60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
fd70: 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
fd80: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
fd90: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
fda0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
fdb0: 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
fdc0: 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
fdd0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
fde0: 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
fdf0: 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
fe00: 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
fe10: 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
fe20: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
fe30: 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
fe40: 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
fe50: 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
fe60: 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
fe70: 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
fe80: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
fe90: 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
fea0: 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
feb0: 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
fec0: 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
fed0: 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
fee0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
fef0: 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
ff00: 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
ff10: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
ff20: 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
ff30: 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
ff40: 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
ff50: 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
ff60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
ff70: 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
ff80: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
ff90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
ffa0: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
ffb0: 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
ffc0: 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
ffd0: 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
ffe0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fff0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10000 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
10010 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10020 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 62 74 72 65   p->pBt;..  btre
10030 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
10040 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
10050 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
10060 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
10070 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
10080 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
10090 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
100a0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
100b0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
100c0 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
100d0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
100e0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
100f0 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
10100 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
10110 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
10120 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
10130 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
10140 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
10150 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
10160 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
10170 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10190 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
101a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
101b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
101c0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
101d0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
101e0 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b   0;.  }.  unlock
101f0 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
10200 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
10210 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
10220 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
10230 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
10240 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
10250 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
10260 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
10270 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10280 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
10290 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
102a0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
102b0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
102c0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
102d0 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
102e0 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
102f0 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
10300 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
10310 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
10320 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
10330 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
10340 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
10350 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
10360 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
10370 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
10380 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10390 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
103a0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
103b0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
103c0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
103d0 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
103e0 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
103f0 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
10400 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
10410 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
10420 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
10430 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
10440 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
10450 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
10460 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72  ntegrity(p);.  r
10470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74  .}../*.** Do bot
10490 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f  h phases of a co
104a0 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mmit..*/.int sql
104b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
104c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
104d0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
104e0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
104f0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
10500 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10510 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
10520 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10530 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
10540 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10550 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
10560 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10570 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65   number of write
10580 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e  -cursors open on
10590 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68   this handle. Th
105a0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
105b0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
105c0 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
105d0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
105e0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
105f0 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  t.** defined..*/
10600 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
10610 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74  tWriteCursors(Bt
10620 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10630 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
10640 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
10650 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
10660 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
10670 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
10680 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46     if( pCur->wrF
10690 6c 61 67 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  lag ) r++; .  }.
106a0 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
106b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  ndif../*.** Roll
106c0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
106d0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
106e0 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
106f0 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
10700 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
10710 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
10720 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
10730 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
10740 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
10750 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
10760 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
10770 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
10780 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
10790 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
107a0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
107b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
107c0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
107d0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
107e0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
107f0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
10800 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
10810 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10820 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
10830 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
10840 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10850 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10860 31 3b 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 41  1;..  rc = saveA
10870 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
10880 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
10890 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
108a0 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
108b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
108c0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
108d0 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
108e0 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
108f0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
10900 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
10910 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
10920 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
10930 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
10940 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
10950 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
10960 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
10970 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
10980 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
10990 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
109a0 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
109b0 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
109c0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
109d0 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
109e0 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
109f0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
10a00 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
10a10 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
10a20 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
10a30 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
10a40 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
10a50 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
10a60 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
10a70 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
10a80 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
10a90 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
10aa0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
10ab0 2a 64 62 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  *db = pBt->pCurs
10ac0 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  or->pBtree->pSql
10ad0 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ite;.      if( d
10ae0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
10af0 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63  ite3AbortOtherAc
10b00 74 69 76 65 56 64 62 65 73 28 64 62 2c 20 30 29  tiveVdbes(db, 0)
10b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10b20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
10b30 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
10b40 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65    unlockAllTable
10b50 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  s(p);..  if( p->
10b60 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
10b70 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
10b80 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  rc2;..#ifndef SQ
10b90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10ba0 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54  CUUM.    pBt->nT
10bb0 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  runc = 0;.#endif
10bc0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
10bd0 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
10be0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
10bf0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
10c00 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
10c10 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10c20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
10c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
10c40 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
10c50 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
10c60 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
10c70 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
10c80 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
10c90 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73  So.    ** call s
10ca0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
10cb0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
10cc0 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
10cd0 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
10ce0 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
10cf0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
10d00 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
10d10 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
10d20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
10d30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10d40 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
10d50 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
10d60 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74  ssert( countWrit
10d70 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30  eCursors(pBt)==0
10d80 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
10d90 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
10da0 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  NS_READ;.  }..  
10db0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
10dc0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
10dd0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
10de0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
10df0 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
10e00 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
10e10 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
10e20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
10e30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
10e40 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
10e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d  .    }.  }..  p-
10e60 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
10e70 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e  _NONE;.  pBt->in
10e80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f  Stmt = 0;.  unlo
10e90 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
10ea0 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
10eb0 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65  tegrity(p);.  re
10ec0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10ed0 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
10ee0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
10ef0 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e  on.  The subtran
10f00 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63  saction can.** c
10f10 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
10f20 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
10f30 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
10f40 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20  saction..** You 
10f50 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
10f60 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
10f70 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
10f80 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
10f90 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
10fa0 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
10fb0 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d  tically if the m
10fc0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ain transaction.
10fd0 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  ** commits or ro
10fe0 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
10ff0 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e  Only one subtran
11000 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61  saction may be a
11010 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e  ctive at a time.
11020 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
11030 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74   to try.** to st
11040 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61  art a new subtra
11050 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74  nsaction if anot
11060 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69  her subtransacti
11070 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
11080 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  tive..**.** Stat
11090 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
110a0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
110b0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
110c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
110d0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
110e0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
110f0 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
11100 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
11110 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
11120 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
11130 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
11140 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
11150 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
11160 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
11170 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
11180 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
11190 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
111a0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
111b0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
111c0 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
111d0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
111e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
111f0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72  ;.  if( (p->inTr
11200 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
11210 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ) || pBt->inStmt
11220 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
11230 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
11240 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
11250 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11260 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
11270 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
11280 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
11290 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
112a0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Only ? SQLITE_OK
112b0 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   : sqlite3PagerS
112c0 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  tmtBegin(pBt->pP
112d0 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 69 6e  ager);.  pBt->in
112e0 53 74 6d 74 20 3d 20 31 3b 0a 20 20 72 65 74 75  Stmt = 1;.  retu
112f0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
11300 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74   Commit the stat
11310 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
11320 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
11330 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e   progress.  If n
11340 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74  o.** subtransact
11350 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74  ion is active, t
11360 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
11370 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11380 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74  reeCommitStmt(Bt
11390 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
113a0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
113b0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
113c0 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26  f( pBt->inStmt &
113d0 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
113e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
113f0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
11400 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  mit(pBt->pPager)
11410 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
11420 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11430 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74   }.  pBt->inStmt
11440 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
11450 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
11460 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
11470 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
11480 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f  nsaction.  If no
11490 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a   subtransaction.
114a0 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69  ** is active thi
114b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
114c0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  o-op..**.** All 
114d0 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
114e0 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74  invalidated by t
114f0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
11500 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  Any attempt.** t
11510 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74  o use a cursor t
11520 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
11530 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11540 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a   this operation.
11550 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ** will result i
11560 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  n an error..*/.i
11570 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
11580 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65  ollbackStmt(Btre
11590 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
115a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
115b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
115c0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
115d0 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29  MallocDisallow()
115e0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53  ;.  if( pBt->inS
115f0 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61  tmt && !pBt->rea
11600 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20  dOnly ){.    rc 
11610 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
11620 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  mtRollback(pBt->
11630 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
11640 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
11650 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
11660 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
11670 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 0;.  }.  sql
11680 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28  ite3MallocAllow(
11690 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
116a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  }../*.** Default
116b0 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20   key comparison 
116c0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 75  function to be u
116d0 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61 72  sed if no compar
116e0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ison function.**
116f0 20 69 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e   is specified on
11700 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
11710 65 43 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e 0a  eCursor() call..
11720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 66  */.static int df
11730 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69  ltCompare(.  voi
11740 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  d *NotUsed,     
11750 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20          /* User 
11760 64 61 74 61 20 69 73 20 6e 6f 74 20 75 73 65 64  data is not used
11770 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63 6f   */.  int n1, co
11780 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 20 20  nst void *p1,   
11790 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f   /* First key to
117a0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e   compare */.  in
117b0 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t n2, const void
117c0 20 2a 70 32 20 20 20 20 20 2f 2a 20 53 65 63 6f   *p2     /* Seco
117d0 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  nd key to compar
117e0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b  e */.){.  int c;
117f0 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 31  .  c = memcmp(p1
11800 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e 31  , p2, n1<n2 ? n1
11810 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20 63 3d   : n2);.  if( c=
11820 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31  =0 ){.    c = n1
11830 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74   - n2;.  }.  ret
11840 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
11850 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
11860 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
11870 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
11880 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
11890 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20  Table.  The act 
118a0 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20 63  of acquiring a c
118b0 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65 61  ursor gets a rea
118c0 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68  d lock on .** th
118d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
118e0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
118f0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
11900 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
11910 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
11920 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
11930 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
11940 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
11950 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
11960 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
11970 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
11980 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
11990 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
119a0 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
119b0 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
119c0 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
119d0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
119e0 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
119f0 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
11a00 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
11a10 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
11a20 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
11a30 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
11a40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
11a50 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
11a60 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
11a70 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
11a80 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
11a90 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
11aa0 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
11ab0 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
11ac0 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
11ad0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
11ae0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
11af0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
11b00 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
11b10 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
11b20 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
11b30 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
11b40 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
11b50 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
11b60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
11b70 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
11b80 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
11b90 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
11ba0 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
11bb0 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
11bc0 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
11bd0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
11be0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
11bf0 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
11c00 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
11c10 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
11c20 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
11c30 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
11c40 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
11c50 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
11c60 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
11c70 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
11c80 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ly..**.** The co
11c90 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
11ca0 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67 69 63 61  n must be logica
11cb0 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 6f 72  lly the same for
11cc0 20 65 76 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a   every cursor.**
11cd0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
11ce0 20 74 61 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e   table.  Changin
11cf0 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
11d00 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
11d10 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f  esult.** in inco
11d20 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 73  rrect operations
11d30 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72  .  If the compar
11d40 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  ison function is
11d50 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61   NULL, a.** defa
11d60 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  ult comparison f
11d70 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  unction is used.
11d80 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e    The comparison
11d90 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
11da0 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64 20 66  always ignored f
11db0 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
11dc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11dd0 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
11de0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11e10 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
11e20 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
11e50 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
11e60 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
11e70 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
11ea0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
11eb0 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  ly */.  int (*xC
11ec0 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  mp)(void*,int,co
11ed0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
11ee0 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b  nst void*), /* K
11ef0 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey Comparison fu
11f00 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  nc */.  void *pA
11f10 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
11f40 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
11f50 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70  /.  BtCursor **p
11f60 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
11f90 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
11fa0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
11fb0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53  sor *pCur;.  BtS
11fc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11fd0 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75 72 20 3d  pBt;..  *ppCur =
11fe0 20 30 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   0;.  if( wrFlag
11ff0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
12000 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
12010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12020 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
12030 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
12040 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
12050 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
12060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
12070 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KED;.    }.  }..
12080 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
12090 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
120a0 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
120b0 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
120c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
120d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
120e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
120f0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
12100 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrFlag ){.     
12110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
12120 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
12130 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
12140 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
12150 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  (*pCur) );.  if(
12160 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20   pCur==0 ){.    
12170 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
12180 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  M;.    goto crea
12190 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
121a0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ion;.  }.  pCur-
121b0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
121c0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  o)iTable;.  if( 
121d0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c  iTable==1 && sql
121e0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
121f0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
12200 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
12210 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20  QLITE_EMPTY;.   
12220 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
12230 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
12240 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
12250 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
12260 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
12270 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a  Cur->pPage, 0);.
12280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12290 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
122a0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
122b0 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
122c0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
122d0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
122e0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
122f0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
12300 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
12310 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
12320 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
12330 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
12340 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
12350 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
12360 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
12370 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
12380 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d  pCur->xCompare =
12390 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64   xCmp ? xCmp : d
123a0 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  fltCompare;.  pC
123b0 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b  ur->pArg = pArg;
123c0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
123d0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  = p;.  pCur->wrF
123e0 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  lag = wrFlag;.  
123f0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
12400 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
12410 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
12420 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
12430 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
12440 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
12450 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
12460 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
12470 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70  OR_INVALID;.  *p
12480 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20  pCur = pCur;..  
12490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
124a0 3b 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  ;.create_cursor_
124b0 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28  exception:.  if(
124c0 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c   pCur ){.    rel
124d0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
124e0 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Page);.    sqlit
124f0 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d  eFree(pCur);.  }
12500 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
12510 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
12520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12530 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
12540 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
12550 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
12560 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
12570 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
12580 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
12590 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
125a0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
125b0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
125c0 43 75 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Cur){.  BtShared
125d0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
125e0 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 63 6c 65  tree->pBt;.  cle
125f0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
12600 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 70 43  (pCur);.  if( pC
12610 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
12620 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
12630 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
12640 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
12650 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
12660 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  Cur->pNext;.  }.
12670 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
12680 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
12690 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
126a0 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20  ur->pPrev;.  }. 
126b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
126c0 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c  r->pPage);.  unl
126d0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
126e0 28 70 42 74 29 3b 0a 20 20 69 6e 76 61 6c 69 64  (pBt);.  invalid
126f0 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
12700 28 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65  (pCur);.  sqlite
12710 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65  Free(pCur);.  re
12720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12730 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
12740 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
12750 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74   by filling in t
12760 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65  he fields of pTe
12770 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65  mpCur..** The te
12780 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69  mporary cursor i
12790 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72  s not on the cur
127a0 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65  sor list for the
127b0 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20   Btree..*/.void 
127c0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
127d0 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
127e0 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73  or *pCur, BtCurs
127f0 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20  or *pTempCur){. 
12800 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72   memcpy(pTempCur
12810 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a  , pCur, sizeof(*
12820 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  pCur));.  pTempC
12830 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
12840 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
12850 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d   = 0;.  if( pTem
12860 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
12870 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
12880 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  ef(pTempCur->pPa
12890 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
128a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
128b0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
128c0 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
128d0 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
128e0 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
128f0 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
12900 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20   above..*/.void 
12910 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
12920 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74  aseTempCursor(Bt
12930 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
12940 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65   if( pCur->pPage
12950 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
12960 61 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e  agerUnref(pCur->
12970 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
12980 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
12990 65 20 47 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f 28  e GET_CELL_INFO(
129a0 29 20 6d 61 63 72 6f 2e 20 54 61 6b 65 73 20 6f  ) macro. Takes o
129b0 6e 65 20 61 72 67 75 6d 65 6e 74 2c 20 61 20 70  ne argument, a p
129c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 61 6c 69  ointer to a vali
129d0 64 0a 2a 2a 20 62 74 72 65 65 20 63 75 72 73 6f  d.** btree curso
129e0 72 20 28 74 79 70 65 20 42 74 43 75 72 73 6f 72  r (type BtCursor
129f0 2a 29 2e 20 20 54 68 69 73 20 6d 61 63 72 6f 20  *).  This macro 
12a00 6d 61 6b 65 73 20 73 75 72 65 20 74 68 65 20 42  makes sure the B
12a10 74 43 75 72 73 6f 72 2e 69 6e 66 6f 0a 2a 2a 20  tCursor.info.** 
12a20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76  field of the giv
12a30 65 6e 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  en cursor is val
12a40 69 64 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  id.  If it is no
12a50 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
12a60 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33   call.** sqlite3
12a70 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
12a80 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
12a90 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
12aa0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
12ab0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
12ac0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
12ad0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
12ae0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
12af0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
12b00 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
12b10 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
12b20 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
12b30 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
12b40 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
12b50 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
12b60 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
12b70 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
12b80 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
12b90 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71  f(info));.    sq
12ba0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
12bb0 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
12bc0 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66   pCur->idx, &inf
12bd0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
12be0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
12bf0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
12c00 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
12c10 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
12c20 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
12c30 6f 28 78 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65  o(x).#endif..#de
12c40 66 69 6e 65 20 47 45 54 5f 43 45 4c 4c 5f 49 4e  fine GET_CELL_IN
12c50 46 4f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  FO(pCur)        
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
12c90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
12ca0 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
12cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
12ce0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
12cf0 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  >pPage, pCur->id
12d00 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  x, &pCur->info);
12d10 20 20 20 20 20 20 20 20 20 5c 0a 20 20 65 6c 73           \.  els
12d20 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
12d70 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
12d80 20 20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70    ../*.** Set *p
12d90 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
12da0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
12db0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
12dc0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
12dd0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
12de0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
12df0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
12e00 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
12e10 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
12e20 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
12e30 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
12e40 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
12e50 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
12e60 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
12e70 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
12e80 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
12e90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
12ea0 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
12eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12ec0 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
12ed0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
12ee0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
12ef0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
12f00 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
12f10 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
12f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
12f40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
12f50 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
12f60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
12f70 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
12f80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
12f90 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
12fa0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
12fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fc0 20 47 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f 28 70   GET_CELL_INFO(p
12fd0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
12fe0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
12ff0 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
13000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13010 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
13020 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
13030 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
13040 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
13050 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
13060 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
13070 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53   Always return S
13080 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69  QLITE_OK..** Fai
13090 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
130a0 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75  ible.  If the cu
130b0 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72  rsor is not curr
130c0 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
130d0 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77  g to an entry (w
130e0 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c  hich can happen,
130f0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   for example, if
13100 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
13110 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20   is empty) then 
13120 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
13130 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
13140 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
13150 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
13160 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  u32 *pSize){.  i
13170 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  nt rc = restoreO
13180 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
13190 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
131a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
131b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
131c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
131d0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
131e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
131f0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
13200 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
13210 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
13220 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
13230 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
13240 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65  valid entry - se
13250 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a  t *pSize to 0. *
13260 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  /.      *pSize =
13270 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
13280 20 20 20 20 20 47 45 54 5f 43 45 4c 4c 5f 49 4e       GET_CELL_IN
13290 46 4f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  FO(pCur);.      
132a0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
132b0 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
132c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
132d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
132e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
132f0 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
13300 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
13310 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
13320 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
13330 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
13340 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
13350 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
13360 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
13370 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
13380 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
13390 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
133a0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
133b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
133c0 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
133d0 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
133e0 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
133f0 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
13400 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13410 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
13420 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
13430 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
13440 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e  *.** Unless pPgn
13450 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74  oNext is NULL, t
13460 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
13470 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
13480 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20  low .** page in 
13490 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
134a0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
134b0 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
134c0 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65  e ovfl.** is the
134d0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
134e0 27 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20  's linked list, 
134f0 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
13500 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
13510 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
13520 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65  ot NULL, *ppPage
13530 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d   is set to the M
13540 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a  emPage* handle.*
13550 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e  * for page ovfl.
13560 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
13570 70 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68  pager page may h
13580 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
13590 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e  ed.** with the n
135a0 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65  oContent flag se
135b0 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64  t, so the page d
135c0 61 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76  ata accessable v
135d0 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  ia.** this handl
135e0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75  e may not be tru
135f0 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
13600 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
13610 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
13620 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76  *pBt, .  Pgno ov
13630 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
13640 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f        /* Overflo
13650 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  w page */.  MemP
13660 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
13670 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
13680 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
13690 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
136a0 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
136b0 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
136c0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
136d0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
136e0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74   next = 0;.  int
136f0 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f   rc;..  /* One o
13700 66 20 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74  f these must not
13710 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77   be NULL. Otherw
13720 69 73 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68  ise, why call th
13730 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a  is function? */.
13740 20 20 61 73 73 65 72 74 28 70 70 50 61 67 65 20    assert(ppPage 
13750 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  || pPgnoNext);..
13760 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78    /* If pPgnoNex
13770 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
13780 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
13790 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f   being called to
137a0 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d   obtain.  ** a M
137b0 65 6d 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63  emPage* referenc
137c0 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d  e only. No page-
137d0 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
137e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
137f0 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f   */.  if( !pPgno
13800 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Next ){.    retu
13810 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  rn sqlite3BtreeG
13820 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
13830 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
13840 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13850 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13860 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
13870 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
13880 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
13890 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
138a0 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
138b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
138c0 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
138d0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
138e0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
138f0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
13900 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
13910 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
13920 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
13930 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
13940 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
13950 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
13960 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
13970 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
13980 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
13990 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
139a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
139b0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
139c0 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
139d0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
139e0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
139f0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
13a00 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
13a10 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
13a20 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
13a30 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
13a40 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
13a50 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 73 71    if( iGuess<=sq
13a60 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
13a70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
13a80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
13a90 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
13aa0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
13ab0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
13ac0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13ad0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13ae0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
13af0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
13b00 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
13b10 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
13b20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
13b30 75 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uess;.      }.  
13b40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
13b50 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c    if( next==0 ||
13b60 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d   ppPage ){.    M
13b70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
13b80 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
13b90 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
13ba0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
13bb0 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20  ge, next!=0);.  
13bc0 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
13bd0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
13be0 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  =0);.    if( nex
13bf0 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t==0 && rc==SQLI
13c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
13c10 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
13c20 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
13c30 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50    }..    if( ppP
13c40 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  age ){.      *pp
13c50 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
13c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
13c70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
13c80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
13c90 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
13ca0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
13cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
13cc0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
13cd0 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
13ce0 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
13cf0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
13d00 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
13d10 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
13d20 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
13d30 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
13d40 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
13d50 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
13d60 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
13d70 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
13d80 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
13d90 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
13da0 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
13db0 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
13dc0 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
13dd0 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
13de0 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
13df0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
13e00 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
13e10 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
13e20 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
13e30 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
13e40 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13e50 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
13e60 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
13e70 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
13e80 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
13e90 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
13ea0 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
13eb0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
13ec0 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
13ed0 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
13ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
13ef0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
13f00 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
13f30 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
13f40 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
13f50 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
13f60 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
13f70 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
13f80 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
13f90 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
13fa0 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
13fb0 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
13fc0 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
13fd0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
13fe0 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
13ff0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
14000 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
14010 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
14020 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
14030 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
14040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14050 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14060 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
14070 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
14080 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
14090 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
140a0 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
140b0 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
140c0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
140d0 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
140e0 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
140f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14100 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
14110 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14120 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
14130 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
14140 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
14150 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
14160 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
14170 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
14180 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
14190 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
141a0 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
141b0 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
141c0 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
141d0 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
141e0 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
141f0 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
14200 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
14210 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
14220 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
14230 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
14240 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
14250 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
14260 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
14270 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
14280 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
14290 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
142a0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
142b0 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
142c0 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
142d0 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
142e0 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
142f0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
14300 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
14310 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
14320 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
14330 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
14340 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
14350 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
14360 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
14370 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
14380 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
14390 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
143a0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
143b0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
143c0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
143d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
143e0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
143f0 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
14400 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
14410 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
14420 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
14430 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
14440 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
14450 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
14460 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
14470 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
14480 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
14490 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
144a0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
144b0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
144c0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
144d0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
144e0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
144f0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
14500 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
14510 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
14520 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
14530 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
14540 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
14550 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
14560 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
14570 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
14580 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
14590 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
145a0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
145b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
145c0 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
145d0 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
145e0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
145f0 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
14600 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
14610 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
14620 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
14630 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
14640 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
14650 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
14660 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
14670 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
14680 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
14690 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
146a0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
146b0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  om */.  int offs
146c0 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
146d0 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
146e0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
146f0 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  oad */.  int amt
14700 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
14710 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
14720 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
14730 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
14740 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
14750 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
14760 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
14770 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
14780 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
14790 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
147a0 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
147b0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
147c0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
147d0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
147e0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
147f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
14800 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
14810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
14820 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
14830 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
14840 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
14850 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->pPage;        
14860 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
14870 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
14880 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
14890 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
148a0 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 20 20 20  >pBtree->pBt;   
148b0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
148c0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
148d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
148e0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
148f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
14900 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
14910 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
14920 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
14930 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
14940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
14950 73 65 74 3e 3d 30 20 29 3b 0a 0a 20 20 47 45 54  set>=0 );..  GET
14960 5f 43 45 4c 4c 5f 49 4e 46 4f 28 70 43 75 72 29  _CELL_INFO(pCur)
14970 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
14980 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
14990 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
149a0 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
149b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
149c0 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  0 : pCur->info.n
149d0 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69  Key);..  if( ski
149e0 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73  pKey ){.    offs
149f0 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  et += nKey;.  }.
14a00 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
14a10 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
14a20 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  fo.nData ){.    
14a30 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
14a40 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
14a50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
14a60 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
14a70 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
14a80 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
14a90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
14aa0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
14ab0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
14ac0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
14ad0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
14ae0 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
14af0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
14b00 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
14b10 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
14b20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
14b30 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
14b40 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
14b50 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
14b60 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
14b70 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
14b80 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
14b90 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
14ba0 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
14bb0 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
14bc0 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
14bd0 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
14be0 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
14bf0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
14c00 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
14c10 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
14c20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
14c30 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
14c40 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
14c50 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
14c60 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
14c70 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
14c80 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
14c90 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
14ca0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
14cb0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
14cc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14cd0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
14ce0 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63   /* If the isInc
14cf0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
14d00 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
14d10 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
14d20 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20  ow[].    ** has 
14d30 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
14d40 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
14d50 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69  now. The array i
14d60 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a  s sized at.    *
14d70 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  * one entry for 
14d80 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
14d90 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
14da0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20  ow chain. The.  
14db0 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72    ** page number
14dc0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
14dd0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73  erflow page is s
14de0 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
14df0 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74  ow[0],.    ** et
14e00 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
14e10 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
14e20 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22  [] array means "
14e30 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20  not yet known". 
14e40 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65     ** (the cache
14e50 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
14e60 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
14e70 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e    if( pCur->isIn
14e80 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
14e90 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
14ea0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
14eb0 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
14ec0 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
14ed0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
14ee0 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
14ef0 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e;.      pCur->a
14f00 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f  Overflow = (Pgno
14f10 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
14f20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
14f30 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  fl);.      if( n
14f40 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61  Ovfl && !pCur->a
14f50 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
14f60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14f70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
14f80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
14f90 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
14fa0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
14fb0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
14fc0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
14fd0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
14fe0 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
14ff0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
15000 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
15010 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
15020 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
15030 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
15040 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
15050 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
15060 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
15070 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
15080 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
15090 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
150a0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
150b0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
150c0 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
150d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
150e0 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
150f0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
15100 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
15110 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53  x++){..#ifndef S
15120 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
15130 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  LOB.      /* If 
15140 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
15150 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
15160 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
15170 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
15180 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
15190 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
151a0 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
151b0 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
151c0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
151d0 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
151e0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
151f0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
15200 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Page;.      }.#e
15210 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
15220 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
15230 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
15240 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
15250 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
15260 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
15270 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
15280 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
15290 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
152a0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
152b0 2e 20 54 68 65 20 70 61 67 65 0a 09 2a 2a 20 64  . The page..** d
152c0 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
152d0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
152e0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
152f0 6f 76 65 72 66 6c 6f 77 0a 09 2a 2a 20 70 61 67  overflow..** pag
15300 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
15310 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
15320 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
15330 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
15340 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
15350 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  n..        */.#i
15360 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15370 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
15380 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
15390 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
153a0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
153b0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
153c0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
153d0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
153e0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ];.        } els
153f0 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e .#endif.      
15400 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
15410 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
15420 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
15430 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f  Page);.        o
15440 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
15450 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
15460 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
15470 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
15480 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
15490 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
154a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
154b0 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
154c0 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
154d0 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
154e0 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
154f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15500 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
15510 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  ;.        int a 
15520 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72  = amt;.        r
15530 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15540 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
15550 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
15560 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
15570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61  ){.          aPa
15590 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
155a0 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
155b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
155c0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
155d0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
155e0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b           if( a +
155f0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
15600 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
15610 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
15620 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
15630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
15640 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
15650 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
15660 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  +4], pBuf, a, eO
15670 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  p, pDbPage);.   
15680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
15690 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
156a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66  );.          off
156b0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
156c0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
156d0 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
156e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
156f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15700 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15710 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
15720 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15730 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
15740 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15750 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
15760 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
15770 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
15780 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
15790 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
157a0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
157b0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
157c0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
157d0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
157e0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
157f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
15800 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
15810 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
15820 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
15830 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
15840 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
15850 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
15860 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
15870 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
15880 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
15890 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
158a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
158b0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
158c0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
158d0 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65  int rc = restore
158e0 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
158f0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
15900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15910 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15920 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
15930 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
15940 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
15950 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20  pPage!=0 );.    
15960 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  if( pCur->pPage-
15970 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
15980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
15990 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
159a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
159b0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
159c0 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ey==0 );.    ass
159d0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
159e0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
159f0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
15a00 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
15a10 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
15a20 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
15a30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
15a40 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  Buf, 0, 0);.  }.
15a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15a60 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
15a70 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
15a80 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
15a90 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
15aa0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
15ab0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
15ac0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
15ad0 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
15ae0 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
15af0 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
15b00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
15b10 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
15b20 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
15b30 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
15b40 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
15b50 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
15b60 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
15b70 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
15b80 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
15b90 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15ba0 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
15bb0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
15bc0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
15bd0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
15be0 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  nt rc = restoreO
15bf0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
15c00 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
15c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15c20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15c30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15c40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
15c50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
15c60 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
15c70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
15c80 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
15c90 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
15ca0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
15cb0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
15cc0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
15cd0 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20   pBuf, 1, 0);.  
15ce0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15cf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
15d00 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
15d10 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
15d20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
15d30 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
15d40 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
15d50 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
15d60 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
15d70 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
15d80 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
15d90 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
15da0 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
15db0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
15dc0 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
15dd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15de0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
15df0 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
15e00 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
15e10 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
15e20 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
15e30 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
15e40 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
15e50 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
15e60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
15e70 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
15e80 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
15e90 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
15ea0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
15eb0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
15ec0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
15ed0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
15ee0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
15ef0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
15f00 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
15f10 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
15f20 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
15f30 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
15f40 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
15f50 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
15f60 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
15f70 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
15f80 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
15f90 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
15fa0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
15fb0 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65  sembly.** the ke
15fc0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
15fd0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
15fe0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
15ff0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
16000 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
16010 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
16020 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
16030 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
16040 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16050 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
16060 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
16070 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
16080 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
16090 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
160a0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
160b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
160c0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
160d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
160e0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
160f0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
16100 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
16110 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
16120 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
16130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
16140 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
16150 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
16160 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
16170 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
16180 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
16190 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
161a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
161b0 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
161c0 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
161d0 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  Key;.  int nLoca
161e0 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
161f0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ur!=0 && pCur->p
16200 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
16210 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
16220 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
16230 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
16240 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
16250 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
16260 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
16270 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
16280 47 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f 28 70 43  GET_CELL_INFO(pC
16290 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
162a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
162b0 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
162c0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
162d0 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
162e0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
162f0 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
16300 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70  se{.    nKey = p
16310 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
16320 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
16330 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
16340 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
16350 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
16360 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
16370 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
16380 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
16390 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69  fo.nLocal;.    i
163a0 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29  f( nLocal>nKey )
163b0 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
163c0 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d   nKey;.    }.  }
163d0 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
163e0 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
163f0 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
16400 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
16410 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
16420 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
16430 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
16440 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
16450 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
16460 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
16470 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
16480 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
16490 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
164a0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
164b0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
164c0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
164d0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
164e0 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
164f0 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
16500 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
16510 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
16520 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2e 0a   Btree routine..
16530 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
16540 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
16550 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
16560 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
16570 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
16580 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
16590 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
165a0 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
165b0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
165c0 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
165d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
165e0 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70   *pAmt){.  if( p
165f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
16600 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
16610 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
16620 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
16630 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29  d(pCur, pAmt, 0)
16640 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
16650 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
16660 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
16670 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
16680 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
16690 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  {.  if( pCur->eS
166a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
166b0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
166c0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
166d0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
166e0 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
166f0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
16700 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
16710 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
16720 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
16730 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
16740 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
16750 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16760 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
16770 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  move to..*/.stat
16780 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
16790 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
167a0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
167b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
167c0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
167d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50    MemPage *pOldP
167e0 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
167f0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
16800 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  ree->pBt;..  ass
16810 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
16820 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
16830 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64  );.  rc = getAnd
16840 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
16850 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
16860 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  , pCur->pPage);.
16870 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16880 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65  n rc;.  pNewPage
16890 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43  ->idxParent = pC
168a0 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50  ur->idx;.  pOldP
168b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
168c0 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69  e;.  pOldPage->i
168d0 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
168e0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50  eleasePage(pOldP
168f0 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
16900 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  age = pNewPage;.
16910 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
16920 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
16930 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
16940 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
16950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16960 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
16970 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
16980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
169a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
169b0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
169c0 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a   of its table..*
169d0 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c  *.** The virtual
169e0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
169f0 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  e root page for 
16a00 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75  most tables.  Bu
16a10 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  t.** for the tab
16a20 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67  le rooted on pag
16a30 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68  e 1, sometime th
16a40 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65  e real root page
16a50 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63  .** is empty exc
16a60 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68  ept for the righ
16a70 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73  t-pointer.  In s
16a80 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  uch cases the.**
16a90 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
16aa0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
16ab0 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f  hat the right-po
16ac0 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a  inter of page.**
16ad0 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74   1 is pointing t
16ae0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
16af0 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
16b00 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
16b10 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
16b20 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
16b30 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61  arent;.  if( pPa
16b40 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  rent==0 ) return
16b50 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e   1;.  if( pParen
16b60 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75  t->pgno>1 ) retu
16b70 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32  rn 0;.  if( get2
16b80 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
16b90 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
16ba0 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29  rOffset+3])==0 )
16bb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
16bc0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16bd0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
16be0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
16bf0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
16c00 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
16c10 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
16c20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
16c30 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
16c40 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
16c50 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
16c60 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
16c70 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
16c80 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
16c90 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
16ca0 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
16cb0 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
16cc0 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
16cd0 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
16ce0 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
16cf0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
16d00 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
16d10 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61  pParent;.  MemPa
16d20 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
16d30 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61   idxParent;..  a
16d40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
16d50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
16d60 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  D );.  pPage = p
16d70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
16d80 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
16d90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
16da0 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
16db0 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20  age(pPage) );.  
16dc0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
16dd0 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65  >pParent;.  asse
16de0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29  rt( pParent!=0 )
16df0 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20  ;.  idxParent = 
16e00 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
16e10 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16e20 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
16e30 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
16e40 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70  Page(pPage);.  p
16e50 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61  Cur->pPage = pPa
16e60 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  rent;.  pCur->in
16e70 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
16e80 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
16e90 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a  >idxShift==0 );.
16ea0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64    pCur->idx = id
16eb0 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xParent;.}../*.*
16ec0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
16ed0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
16ee0 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
16ef0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
16f00 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
16f10 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
16f20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16f30 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
16f40 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
16f50 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28  ree->pBt;..  if(
16f60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16f70 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
16f80 4b 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75  K ){.    clearCu
16f90 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
16fa0 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  r);.  }.  pRoot 
16fb0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
16fc0 20 69 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52   if( pRoot && pR
16fd0 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
16fe0 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  >pgnoRoot ){.   
16ff0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
17000 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73  isInit );.  }els
17010 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20  e{.    if( .    
17020 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
17030 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
17040 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
17050 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
17060 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
17070 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
17080 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
17090 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
170a0 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
170b0 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
170c0 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  e);.    pCur->pP
170d0 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d  age = pRoot;.  }
170e0 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
170f0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
17100 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
17110 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pRoot->nCell==0 
17120 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  && !pRoot->leaf 
17130 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
17140 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  age;.    assert(
17150 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pRoot->pgno==1 
17160 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  );.    subpage =
17170 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
17180 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
17190 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
171a0 20 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67    assert( subpag
171b0 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  e>0 );.    pCur-
171c0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
171d0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
171e0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
171f0 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
17200 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
17210 3d 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  = ((pCur->pPage-
17220 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52  >nCell>0)?CURSOR
17230 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e  _VALID:CURSOR_IN
17240 56 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72 6e  VALID);.  return
17250 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
17260 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
17270 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
17280 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
17290 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
172a0 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
172b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
172c0 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
172d0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
172e0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
172f0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
17300 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
17310 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
17320 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
17330 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
17340 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
17350 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
17360 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
17370 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
17380 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
17390 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
173a0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
173b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
173c0 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
173d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
173e0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
173f0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
17400 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
17410 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
17420 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
17430 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
17440 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
17450 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
17460 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17470 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17480 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
17490 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
174a0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
174b0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
174c0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
174d0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
174e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
174f0 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
17500 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
17510 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
17520 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
17530 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
17540 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
17550 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
17560 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
17570 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
17580 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
17590 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
175a0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
175b0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
175c0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
175d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
175e0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
175f0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
17600 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
17610 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
17620 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
17630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17640 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
17650 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
17660 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
17670 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
17680 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
17690 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
176a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
176b0 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
176c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
176d0 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
176e0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
176f0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
17700 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
17710 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64  ]);.    pCur->id
17720 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
17730 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
17740 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
17750 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
17760 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17770 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
17780 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a  age->nCell - 1;.
17790 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
177a0 7a 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ze = 0;.  return
177b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
177c0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
177d0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
177e0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
177f0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
17800 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
17810 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
17820 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
17830 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
17840 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
17850 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
17860 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
17870 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
17880 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
17890 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
178a0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
178b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
178c0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
178d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
178e0 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 70  turn rc;.  if( p
178f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17900 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
17910 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
17920 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
17930 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
17940 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
17950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
17960 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
17970 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
17980 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 63   *pRes = 0;.  rc
17990 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
179a0 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
179b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
179c0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
179d0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
179e0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
179f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
17a00 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
17a10 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
17a20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
17a30 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
17a40 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
17a50 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
17a60 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
17a70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
17a80 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
17a90 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
17aa0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
17ab0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
17ac0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
17ad0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17ae0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
17af0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
17b00 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
17b10 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
17b20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
17b30 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
17b40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17b50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
17b60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17b70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
17b80 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  pRes = 0;.  rc =
17b90 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
17ba0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
17bb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
17bc0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
17bd0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
17be0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 70 4b  an entry near pK
17bf0 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75  ey/nKey..** Retu
17c00 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
17c10 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
17c20 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79  KEY tables, only
17c30 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d 65   the nKey parame
17c40 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 4b  ter is used.  pK
17c50 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
17c60 2e 20 20 46 6f 72 20 6f 74 68 65 72 20 74 61 62  .  For other tab
17c70 6c 65 73 2c 20 6e 4b 65 79 20 69 73 20 74 68 65  les, nKey is the
17c80 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17c90 20 6f 66 20 64 61 74 61 0a 2a 2a 20 69 6e 20 70   of data.** in p
17ca0 4b 65 79 2e 20 20 54 68 65 20 63 6f 6d 70 61 72  Key.  The compar
17cb0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 73 70  ison function sp
17cc0 65 63 69 66 69 65 64 20 77 68 65 6e 20 74 68 65  ecified when the
17cd0 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 63   cursor was.** c
17ce0 72 65 61 74 65 64 20 69 73 20 75 73 65 64 20 74  reated is used t
17cf0 6f 20 63 6f 6d 70 61 72 65 20 6b 65 79 73 2e 0a  o compare keys..
17d00 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
17d10 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
17d20 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
17d30 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
17d40 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
17d50 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
17d60 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
17d70 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
17d80 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
17d90 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
17da0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
17db0 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
17dc0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
17dd0 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
17de0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
17df0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
17e00 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
17e10 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a  y to which the.*
17e20 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74  * cursor is writ
17e30 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20  ten to *pRes if 
17e40 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65  pRes!=NULL.  The
17e50 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74   meaning of.** t
17e60 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20  his value is as 
17e70 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
17e80 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
17e90 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
17ea0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
17eb0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
17ee0 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20   pKey or if the 
17ef0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
17f00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17f10 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
17f20 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
17f30 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
17f40 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
17f50 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
17f60 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
17f70 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
17f80 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
17fa0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b  actly matches pK
17fb0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
17fc0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
17fd0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
17fe0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
17ff0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
18000 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
18010 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  arger than pKey.
18020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18030 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
18040 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
18050 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
18060 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
18070 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
18080 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
18090 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f  e key content fo
180a0 72 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20  r indices.  Not 
180b0 75 73 65 64 20 62 79 20 74 61 62 6c 65 73 20 2a  used by tables *
180c0 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
180d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
180e0 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20  ze of pKey.  Or 
180f0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  the key for tabl
18100 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
18110 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f  Right,         /
18120 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
18130 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
18140 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
18150 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
18160 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
18170 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a   result flag */.
18180 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
18190 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
181a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
181b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
181c0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
181d0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
181e0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
181f0 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  it );.  if( pCur
18200 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18210 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
18220 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
18230 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18240 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
18250 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18260 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f 72  TE_OK;.  }.  for
18270 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
18280 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f  r, upr;.    Pgno
18290 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
182a0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
182b0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69  ur->pPage;.    i
182c0 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
182d0 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
182e0 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
182f0 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
18300 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
18310 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
18320 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
18330 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65 79  ->intKey && pKey
18340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
18350 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18360 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
18370 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
18380 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
18390 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d  idx = upr;.    }
183a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
183b0 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72  ->idx = (upr+lwr
183c0 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  )/2;.    }.    i
183d0 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f  f( lwr<=upr ) fo
183e0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69  r(;;){.      voi
183f0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
18400 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
18410 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  .      pCur->inf
18420 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
18430 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
18440 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
18450 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
18460 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
18470 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
18480 3e 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63  >idx) + pPage->c
18490 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
184a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
184b0 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
184c0 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
184d0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
184e0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
184f0 43 65 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  Cell, &dummy);. 
18500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18510 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
18520 2c 20 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b  , (u64 *)&nCellK
18530 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
18540 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29   nCellKey<nKey )
18550 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
18560 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
18570 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e  e if( nCellKey>n
18580 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
18590 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
185a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
185b0 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
185c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
185d0 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69          int avai
185e0 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70  lable;.        p
185f0 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20  CellKey = (void 
18600 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
18610 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c  Cur, &available,
18620 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65   0);.        nCe
18630 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e  llKey = pCur->in
18640 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
18650 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d   if( available>=
18660 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20  nCellKey ){.    
18670 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e        c = pCur->
18680 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70  xCompare(pCur->p
18690 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70  Arg, nCellKey, p
186a0 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  CellKey, nKey, p
186b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
186c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
186d0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
186e0 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43 65 6c 6c  MallocRaw( nCell
186f0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
18700 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
18710 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18720 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
18730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18740 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
18750 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20  nCellKey, (void 
18760 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
18770 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d         c = pCur-
18780 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e  >xCompare(pCur->
18790 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  pArg, nCellKey, 
187a0 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20  pCellKey, nKey, 
187b0 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  pKey);.         
187c0 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c   sqliteFree(pCel
187d0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
187e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
187f0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
18800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18810 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
18820 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
18830 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
18840 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
18850 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64    lwr = pCur->id
18860 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
18870 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
18880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
188a0 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
188b0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
188c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
188d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
188e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
188f0 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
18900 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69     lwr = pCur->i
18910 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
18920 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
18930 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20   pCur->idx-1;.  
18940 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18950 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20  lwr>upr ){.     
18960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18970 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64  }.      pCur->id
18980 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
18990 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
189a0 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
189b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
189c0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
189d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
189e0 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
189f0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
18a00 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
18a10 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
18a20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
18a30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
18a40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
18a50 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
18a60 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
18a70 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
18a80 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
18a90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
18aa0 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
18ab0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18ac0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18ad0 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
18ae0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69  nCell );.      i
18af0 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20  f( pRes ) *pRes 
18b00 3d 20 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = c;.      retur
18b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18b20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78   }.    pCur->idx
18b30 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72   = lwr;.    pCur
18b40 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
18b50 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
18b60 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
18b70 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
18b80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18b90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
18ba0 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20   /* NOT REACHED 
18bb0 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  */.}../*.** Retu
18bc0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
18bd0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
18be0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
18bf0 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
18c00 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
18c10 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
18c20 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
18c30 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
18c40 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
18c50 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
18c60 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
18c70 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
18c80 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
18c90 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
18ca0 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
18cb0 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
18cc0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
18cd0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
18ce0 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
18cf0 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
18d00 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
18d10 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
18d20 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
18d30 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
18d40 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
18d50 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
18d60 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
18d70 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
18d80 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
18d90 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
18da0 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
18db0 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
18dc0 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
18dd0 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
18de0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
18df0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
18e00 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
18e10 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
18e20 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
18e30 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
18e40 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
18e50 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
18e60 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
18e70 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
18e80 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
18e90 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
18ea0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
18eb0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
18ec0 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
18ed0 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
18ee0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
18ef0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
18f00 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
18f10 61 67 65 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73  age;..  rc = res
18f20 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
18f30 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
18f40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
18f60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
18f70 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
18f80 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
18f90 70 50 61 67 65 3b 0a 20 20 69 66 28 20 43 55 52  pPage;.  if( CUR
18fa0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
18fb0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
18fc0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
18fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18fe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
18ff0 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20  ->skip>0 ){.    
19000 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
19010 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
19020 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19030 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
19040 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 61 73  >skip = 0;..  as
19050 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
19060 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
19070 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
19080 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43  ->nCell );..  pC
19090 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70 43 75  ur->idx++;.  pCu
190a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
190b0 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  0;.  if( pCur->i
190c0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
190d0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
190e0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
190f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
19100 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
19110 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
19120 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
19130 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
19140 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
19150 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
19160 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
19170 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
19180 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
19190 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
191a0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
191b0 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
191c0 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
191d0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
191e0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
191f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
19200 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
19210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
19230 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
19240 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
19250 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
19260 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77  r->pPage;.    }w
19270 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e  hile( pCur->idx>
19280 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
19290 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
192a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
192b0 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
192c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
192d0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
192e0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
192f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19300 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
19310 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
19320 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
19330 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
19340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19350 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
19360 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
19370 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
19380 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  rc;.}../*.** Ste
19390 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
193a0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
193b0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
193c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
193d0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
193e0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
193f0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
19400 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
19410 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
19420 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
19430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
19440 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
19450 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
19460 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
19470 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
19480 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
19490 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
194a0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
194b0 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   rc;.  Pgno pgno
194c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
194d0 67 65 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74  ge;..  rc = rest
194e0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
194f0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
19500 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19510 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
19520 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
19530 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
19540 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
19550 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
19560 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19570 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
19580 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20  Cur->skip<0 ){. 
19590 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
195a0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
195b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
195c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
195d0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
195e0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
195f0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
19600 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
19610 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
19620 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28  >idx>=0 );.  if(
19630 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
19640 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
19650 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70  byte( findCell(p
19660 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
19670 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   );.    rc = mov
19680 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
19690 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
196a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
196b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
196c0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
196d0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
196e0 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29  ( pCur->idx==0 )
196f0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
19700 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
19710 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
19720 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
19730 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
19740 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
19750 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
19760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
19780 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
19790 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
197a0 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
197b0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a  r->pPage;.    }.
197c0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b      pCur->idx--;
197d0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
197e0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69  nSize = 0;.    i
197f0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
19800 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ta && !pPage->le
19810 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
19820 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
19830 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
19840 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19850 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19860 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
19870 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
19880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19890 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
198a0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
198b0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
198c0 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
198d0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
198e0 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
198f0 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
19900 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
19910 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
19920 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
19930 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
19940 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
19950 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
19960 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
19970 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
19980 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
19990 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
199a0 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
199b0 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
199c0 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
199d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
199e0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
199f0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
19a00 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
19a10 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
19a20 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
19a30 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
19a40 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
19a50 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
19a60 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
19a70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19a80 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
19a90 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
19aa0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
19ab0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
19ac0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
19ad0 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
19ae0 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
19af0 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
19b00 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
19b10 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
19b20 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
19b30 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
19b40 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
19b50 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
19b60 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
19b70 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
19b80 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
19b90 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
19ba0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
19bb0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
19bc0 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
19bd0 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
19be0 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
19bf0 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
19c00 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
19c10 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
19c20 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
19c30 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
19c40 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
19c50 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
19c60 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
19c70 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
19c80 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
19c90 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
19ca0 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
19cb0 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
19cc0 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
19cd0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
19ce0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
19cf0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
19d00 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
19d10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
19d20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
19d30 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
19d40 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
19d50 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
19d60 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  int k;     /* Nu
19d70 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
19d80 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
19d90 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
19da0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
19db0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
19dc0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
19dd0 0a 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ..  pPage1 = pBt
19de0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20  ->pPage1;.  n = 
19df0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
19e00 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
19e10 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
19e20 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
19e30 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
19e40 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
19e50 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
19e60 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
19e70 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
19e80 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
19e90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
19ea0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
19eb0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
19ec0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
19ed0 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
19ee0 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
19ef0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
19f00 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
19f10 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
19f20 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
19f30 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
19f40 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
19f50 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
19f60 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
19f70 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
19f80 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
19f90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19fa0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
19fb0 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26      if( exact &&
19fc0 20 6e 65 61 72 62 79 3c 3d 73 71 6c 69 74 65 33   nearby<=sqlite3
19fd0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
19fe0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
19ff0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
1a000 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
1a010 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  rby>0 );.      a
1a020 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
1a030 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
1a040 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1a050 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
1a060 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pe, 0);.      if
1a070 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1a080 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1a090 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1a0a0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  GE ){.        se
1a0b0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
1a0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67      }.      *pPg
1a0d0 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20  no = nearby;.   
1a0e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1a0f0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1a100 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
1a110 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
1a120 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1a130 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
1a140 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
1a150 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
1a160 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
1a170 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
1a180 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1a190 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1a1a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1a1b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1a1c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1a1d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1a1e0 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
1a1f0 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
1a200 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
1a210 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
1a220 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
1a230 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
1a240 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
1a250 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
1a260 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
1a270 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
1a280 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
1a290 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
1a2a0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
1a2b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
1a2c0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
1a2d0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
1a2e0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
1a2f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
1a300 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1a310 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1a320 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
1a330 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
1a340 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1a350 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1a360 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1a380 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1a390 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
1a3a0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1a3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
1a3c0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1a3d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1a3e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
1a3f0 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
1a400 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1a410 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
1a420 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
1a430 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
1a440 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
1a450 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
1a460 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
1a470 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
1a480 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
1a490 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
1a4a0 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
1a4b0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
1a4c0 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
1a4d0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
1a4e0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1a4f0 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
1a500 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1a510 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1a520 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1a530 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1a540 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1a550 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1a560 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1a570 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
1a580 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
1a590 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1a5a0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
1a5b0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1a5c0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
1a5d0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1a5e0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1a5f0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
1a600 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1a610 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
1a620 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
1a630 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
1a640 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
1a650 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1a660 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
1a670 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
1a680 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
1a690 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
1a6a0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1a6b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1a6c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1a6d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1a6e0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
1a6f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a700 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1a710 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
1a720 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
1a730 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
1a740 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
1a750 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
1a760 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
1a770 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
1a780 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
1a790 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
1a7a0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
1a7b0 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
1a7c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a7d0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
1a7e0 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
1a7f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1a800 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
1a810 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1a820 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a830 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1a840 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1a850 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1a860 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1a870 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1a880 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a890 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
1a8a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1a8b0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1a8c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1a8d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1a8e0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1a8f0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1a900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a910 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1a920 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1a930 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
1a940 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1a950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a970 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
1a980 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
1a990 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
1a9a0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
1a9b0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
1a9c0 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
1a9d0 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
1a9e0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
1a9f0 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
1aa00 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
1aa10 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
1aa20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
1aa30 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
1aa40 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
1aa50 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
1aa60 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1aa70 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
1aa80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1aa90 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1aaa0 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
1aab0 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
1aac0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1aad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aae0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1aaf0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1ab00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ab10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ab20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
1ab30 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
1ab40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ab50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ab60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1ab70 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1ab80 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1ab90 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1aba0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1abb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1abc0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
1abd0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
1abe0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1abf0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
1ac00 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
1ac10 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
1ac20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
1ac30 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
1ac40 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
1ac50 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
1ac60 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
1ac70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1ac80 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1ac90 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
1aca0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1acb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1acc0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1acd0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1ace0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1acf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1ad00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ad10 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
1ad20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1ad30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1ad40 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1ad50 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1ad60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1ad80 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1ad90 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
1ada0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1adb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1adc0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1add0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
1ade0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
1adf0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
1ae00 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
1ae10 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
1ae20 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
1ae30 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
1ae40 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
1ae50 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
1ae60 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74       int closest
1ae70 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
1ae80 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
1ae90 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
1aea0 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
1aeb0 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ta;.        rc =
1aec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1aed0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1aee0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1aef0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1af00 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1af10 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1af20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
1af30 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
1af40 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74       int i, dist
1af50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
1af60 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1af70 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79     dist = get4by
1af80 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
1af90 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
1afa0 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64    if( dist<0 ) d
1afb0 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20  ist = -dist;.   
1afc0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
1afd0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
1afe0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
1aff0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1b000 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
1b010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1b020 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64  ( d2<0 ) d2 = -d
1b030 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  2;.            i
1b040 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
1b050 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
1b060 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
1b070 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
1b080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1b090 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b0a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b0b0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
1b0c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1b0d0 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
1b0e0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
1b0f0 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
1b100 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
1b110 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65  ist || iPage==ne
1b120 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
1b130 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
1b140 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b150 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  *pPgno>sqlite3Pa
1b160 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1b170 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
1b180 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
1b190 20 70 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e   page off the en
1b1a0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
1b1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1b1c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1b1d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1b1e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54     }.          T
1b1f0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1b200 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
1b210 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
1b220 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
1b230 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
1b240 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
1b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1b260 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
1b270 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
1b280 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
1b290 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
1b2a0 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
1b2b0 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
1b2c0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
1b2d0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
1b2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b2f0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1b300 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
1b310 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1b320 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1b330 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1b340 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
1b350 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1b360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b380 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1b390 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  k((*ppPage)->pDb
1b3a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1b3b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b3c0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1b3d0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1b3e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1b3f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1b410 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1b420 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1b430 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1b440 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1b450 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1b460 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b470 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1b480 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
1b490 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
1b4a0 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
1b4b0 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
1b4c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
1b4d0 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
1b4e0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
1b4f0 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
1b500 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
1b510 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1b520 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  */.    *pPgno = 
1b530 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1b540 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1b550 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66  r) + 1;..#ifndef
1b560 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b570 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1b580 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
1b590 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d       /* An incr-
1b5a0 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72 65 61  vacuum has alrea
1b5b0 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20 74 68  dy run within th
1b5c0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
1b5d0 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  So the.      ** 
1b5e0 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  page to allocate
1b5f0 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65   is not from the
1b600 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20 6f 66   physical end of
1b610 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74 0a 20   the file, but. 
1b620 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e       ** at pBt->
1b630 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a  nTrunc. .      *
1b640 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  /.      *pPgno =
1b650 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a   pBt->nTrunc+1;.
1b660 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
1b670 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1b680 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1b690 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
1b6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b6b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1b6c0 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
1b6d0 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67  ISPAGE(pBt, *pPg
1b6e0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  no) ){.      /* 
1b6f0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
1b700 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
1b710 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
1b720 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
1b730 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
1b740 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
1b750 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
1b760 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
1b770 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
1b780 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
1b790 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
1b7a0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
1b7b0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
1b7c0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
1b7d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1b7e0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
1b7f0 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
1b800 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
1b810 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
1b820 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1b830 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1b840 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28  (pBt) );.      (
1b850 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d  *pPgno)++;.    }
1b860 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  .    if( pBt->nT
1b870 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42  runc ){.      pB
1b880 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67  t->nTrunc = *pPg
1b890 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  no;.    }.#endif
1b8a0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
1b8b0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1b8c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1b8d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b8e0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1b8f0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1b900 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1b910 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b920 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b930 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
1b940 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
1b950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1b970 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
1b980 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
1b990 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1b9a0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
1b9b0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
1b9c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1b9d0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1b9e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1b9f0 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
1ba00 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
1ba10 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
1ba20 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
1ba30 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
1ba40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1ba50 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20  d a page of the 
1ba60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1ba70 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
1ba80 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  *.** sqlite3Page
1ba90 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20  rUnref() is NOT 
1baa0 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65  called for pPage
1bab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bac0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
1bad0 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68   *pPage){.  BtSh
1bae0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1baf0 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  e->pBt;.  MemPag
1bb00 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1bb10 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  >pPage1;.  int r
1bb20 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50  c, n, k;..  /* P
1bb30 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65 20  repare the page 
1bb40 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  for freeing */. 
1bb50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1bb60 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67  pgno>1 );.  pPag
1bb70 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
1bb80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1bb90 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
1bba0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
1bbb0 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d   0;..  /* Increm
1bbc0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
1bbd0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
1bbe0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
1bbf0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1bc00 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1bc10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1bc20 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34  n rc;.  n = get4
1bc30 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1bc40 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
1bc50 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1bc60 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a  ata[36], n+1);..
1bc70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
1bc80 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
1bc90 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   If the SQLITE_S
1bca0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d  ECURE_DELETE com
1bcb0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1bcc0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
1bcd0 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75  n.  ** always fu
1bce0 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
1bcf0 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
1bd00 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
1bd10 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1bd20 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1bd30 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
1bd40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1bd50 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  c;.  memset(pPag
1bd60 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
1bd70 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
1bd80 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  e);.#endif..#ifn
1bd90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bda0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
1bdb0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1bdc0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
1bdd0 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
1bde0 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
1bdf0 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
1be00 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1be10 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
1be20 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
1be30 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1be40 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
1be50 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  (pBt, pPage->pgn
1be60 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  o, PTRMAP_FREEPA
1be70 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
1be80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1be90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
1bea0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( n==0 ){.    /*
1beb0 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
1bec0 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a  st free page */.
1bed0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bee0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1bef0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1bf00 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1bf10 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  rc;.    memset(p
1bf20 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
1bf30 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  8);.    put4byte
1bf40 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1bf50 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
1bf60 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 46  );.    TRACE(("F
1bf70 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72  REE-PAGE: %d fir
1bf80 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  st\n", pPage->pg
1bf90 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no));.  }else{. 
1bfa0 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65     /* Other free
1bfb0 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 65   pages already e
1bfc0 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20 74  xist.  Retrive t
1bfd0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  he first trunk p
1bfe0 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  age.    ** of th
1bff0 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66  e freelist and f
1c000 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ind out how many
1c010 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e 20   leaves it has. 
1c020 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
1c030 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d  pTrunk;.    rc =
1c040 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1c050 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
1c060 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1c070 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c  a[32]), &pTrunk,
1c080 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1c090 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c0a0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
1c0b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
1c0c0 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74  ;.    if( k>=pBt
1c0d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
1c0e0 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54   8 ){.      /* T
1c0f0 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c  he trunk is full
1c100 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65  .  Turn the page
1c110 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74   being freed int
1c120 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a  o a new.      **
1c130 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68   trunk page with
1c140 20 6e 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20   no leaves. */. 
1c150 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c160 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1c170 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1c180 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1c190 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74  rn rc;.      put
1c1a0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1c1b0 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  ta, pTrunk->pgno
1c1c0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1c1d0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1c1e0 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  4], 0);.      pu
1c1f0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1c200 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65  aData[32], pPage
1c210 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54  ->pgno);.      T
1c220 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
1c230 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
1c240 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
1c250 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c260 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
1c270 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
1c280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c290 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c   /* Add the newl
1c2a0 79 20 66 72 65 65 64 20 70 61 67 65 20 61 73 20  y freed page as 
1c2b0 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75  a leaf on the cu
1c2c0 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20  rrent trunk */. 
1c2d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c2e0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1c2f0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1c300 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c320 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
1c330 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31  k->aData[4], k+1
1c340 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1c350 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1c360 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65  ta[8+k*4], pPage
1c370 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
1c380 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1c390 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 73 71  ELETE.        sq
1c3a0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1c3b0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
1c3c0 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ge);.#endif.    
1c3d0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
1c3e0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1c3f0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
1c400 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
1c410 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
1c420 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
1c430 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1c440 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
1c450 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
1c460 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
1c470 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
1c480 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
1c490 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
1c4a0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
1c4b0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
1c4c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
1c4d0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
1c4e0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1c4f0 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
1c500 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
1c510 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
1c520 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e   int nOvfl;.  in
1c530 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  t ovflPageSize;.
1c540 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
1c550 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
1c560 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1c570 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
1c580 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
1c590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c5a0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
1c5b0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
1c5c0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
1c5d0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
1c5e0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
1c5f0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
1c600 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
1c610 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
1c620 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1c630 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
1c640 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
1c650 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
1c660 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
1c670 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
1c680 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
1c690 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
1c6a0 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
1c6b0 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  - ){.    MemPage
1c6c0 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28   *pOvfl;.    if(
1c6d0 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
1c6e0 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33  ovflPgno>sqlite3
1c6f0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1c700 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
1c710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c720 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1c730 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1c740 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1c750 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
1c760 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d  &pOvfl, (nOvfl==
1c770 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b  0)?0:&ovflPgno);
1c780 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1c790 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1c7a0 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c  = freePage(pOvfl
1c7b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1c7c0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
1c7d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1c7e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1c7f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1c800 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c810 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
1c820 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
1c830 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
1c840 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
1c850 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
1c860 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
1c870 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
1c880 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
1c890 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
1c8a0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
1c8b0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
1c8c0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1c8d0 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
1c8e0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
1c8f0 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
1c900 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
1c910 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
1c920 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
1c930 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
1c940 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
1c950 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
1c960 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
1c970 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
1c980 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
1c990 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
1c9a0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
1c9b0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
1c9c0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
1c9d0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1c9e0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
1c9f0 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
1ca00 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
1ca10 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
1ca20 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
1ca30 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
1ca40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1ca50 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1ca60 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
1ca70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1ca80 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
1ca90 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
1caa0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
1cab0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1cac0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
1cad0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
1cae0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
1caf0 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
1cb00 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
1cb10 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
1cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb30 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
1cb40 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
1cb50 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
1cb60 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
1cb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1cb80 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
1cb90 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
1cba0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
1cbb0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
1cbc0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
1cbd0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
1cbe0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
1cbf0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1cc00 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
1cc10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1cc20 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
1cc30 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
1cc40 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
1cc50 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1cc60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
1cc70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
1cc80 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
1cc90 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  info;..  /* Fill
1cca0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
1ccb0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
1ccc0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
1ccd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
1cce0 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
1ccf0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
1cd00 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
1cd10 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
1cd20 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
1cd30 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
1cd40 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
1cd50 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
1cd60 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
1cd70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
1cd80 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
1cd90 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  )&nKey);.  sqlit
1cda0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1cdb0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1cdc0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
1cdd0 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
1cde0 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
1cdf0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
1ce00 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
1ce10 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
1ce20 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20  nData+nZero );. 
1ce30 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
1ce40 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
1ce50 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
1ce60 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
1ce70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1ce80 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
1ce90 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
1cea0 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
1ceb0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1cec0 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   nPayload += nKe
1ced0 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
1cee0 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ey;.    nSrc = n
1cef0 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
1cf00 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
1cf10 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
1cf20 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
1cf30 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
1cf40 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
1cf50 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
1cf60 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
1cf70 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
1cf80 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
1cf90 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20  ceLeft==0 ){.   
1cfa0 20 20 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d     int isExact =
1cfb0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1cfc0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1cfd0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
1cfe0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
1cff0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
1d000 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
1d010 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
1d020 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
1d030 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1d040 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1d050 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
1d060 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
1d070 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
1d080 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
1d090 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
1d0a0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
1d0b0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
1d0c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1d0d0 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29  if( pgnoOvfl>1 )
1d0e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  {.          /* i
1d0f0 73 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20  sExact = 1; */. 
1d100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d110 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
1d120 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1d130 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
1d140 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
1d150 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b  oOvfl, isExact);
1d160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d170 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1d180 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d190 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
1d1a0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
1d1b0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
1d1c0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
1d1d0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
1d1e0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
1d1f0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
1d200 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
1d210 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
1d220 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
1d230 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
1d240 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
1d250 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
1d260 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
1d270 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
1d280 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
1d290 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
1d2a0 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
1d2b0 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
1d2c0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
1d2d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
1d2e0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
1d2f0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
1d300 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
1d310 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
1d320 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
1d330 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
1d340 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
1d350 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
1d360 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
1d370 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1d380 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d390 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1d3a0 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
1d3b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d3c0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
1d3d0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
1d3e0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
1d3f0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
1d400 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
1d410 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
1d420 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
1d430 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
1d440 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1d450 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
1d460 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
1d470 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1d480 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d490 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d4a0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
1d4b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d4d0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
1d4e0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
1d4f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1d500 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
1d510 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
1d520 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
1d530 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
1d540 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1d550 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
1d560 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
1d570 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
1d580 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
1d590 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1d5a0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
1d5b0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
1d5c0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
1d5d0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
1d5e0 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63  ft;.    if( nSrc
1d5f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
1d600 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
1d610 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
1d620 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
1d630 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1d640 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
1d650 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
1d660 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
1d670 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
1d680 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
1d690 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
1d6a0 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
1d6b0 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
1d6c0 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
1d6d0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
1d6e0 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
1d6f0 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
1d700 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
1d710 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
1d720 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
1d730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d740 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
1d750 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65  ange the MemPage
1d760 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72  .pParent pointer
1d770 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f   on the page who
1d780 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  se number is.** 
1d790 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
1d7a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20  ond argument so 
1d7b0 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61  that MemPage.pPa
1d7c0 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  rent holds the.*
1d7d0 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
1d7e0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e   third argument.
1d7f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1d800 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53 68  eparentPage(BtSh
1d810 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1d820 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70  pgno, MemPage *p
1d830 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69  NewParent, int i
1d840 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dx){.  MemPage *
1d850 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20  pThis;.  DbPage 
1d860 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
1d870 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21  ert( pNewParent!
1d880 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  =0 );.  if( pgno
1d890 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1d8a0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1d8b0 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ( pBt->pPager!=0
1d8c0 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
1d8d0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1d8e0 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
1d8f0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
1d900 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69  Page ){.    pThi
1d910 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  s = (MemPage *)s
1d920 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1d930 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
1d940 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49    if( pThis->isI
1d950 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nit ){.      ass
1d960 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74  ert( pThis->aDat
1d970 61 3d 3d 28 73 71 6c 69 74 65 33 50 61 67 65 72  a==(sqlite3Pager
1d980 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
1d990 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1d9a0 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70  This->pParent!=p
1d9b0 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  NewParent ){.   
1d9c0 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
1d9d0 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65  pParent ) sqlite
1d9e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68 69  3PagerUnref(pThi
1d9f0 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  s->pParent->pDbP
1da00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 54  age);.        pT
1da10 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  his->pParent = p
1da20 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
1da30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1da40 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70  ef(pNewParent->p
1da50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
1da60 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64  .      pThis->id
1da70 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20  xParent = idx;. 
1da80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1da90 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1daa0 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ge);.  }..#ifnde
1dab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1dac0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
1dad0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1dae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  {.    return ptr
1daf0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
1db00 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1db10 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  pNewParent->pgno
1db20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1db30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1db40 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;.}..../*.** Cha
1db50 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20  nge the pParent 
1db60 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63  pointer of all c
1db70 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65  hildren of pPage
1db80 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a   to point back.*
1db90 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  * to pPage..**.*
1dba0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1dbb0 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c  , for every chil
1dbc0 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f  d of pPage, invo
1dbd0 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  ke reparentPage(
1dbe0 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72  ).** to make sur
1dbf0 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c  e that each chil
1dc00 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61  d knows that pPa
1dc10 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  ge is its parent
1dc20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1dc30 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1dc40 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70   after you memcp
1dc50 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74  y() one page int
1dc60 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f  o.** another..*/
1dc70 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61  .static int repa
1dc80 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d  rentChildPages(M
1dc90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1dca0 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61    int i;.  BtSha
1dcb0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1dcc0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1dcd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1dce0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1dcf0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1dd00 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  OK;..  for(i=0; 
1dd10 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
1dd20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1dd30 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1dd40 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
1dd50 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1dd60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 70  {.      rc = rep
1dd70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
1dd80 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
1dd90 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
1dda0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ddb0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1ddc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1ddd0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dde0 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
1ddf0 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  tPage(pBt, get4b
1de00 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1de10 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1de20 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20  et+8]), .       
1de30 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70  pPage, i);.    p
1de40 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
1de50 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1de60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1de70 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
1de80 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
1de90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
1dea0 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
1deb0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
1dec0 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
1ded0 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
1dee0 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
1def0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
1df00 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
1df10 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
1df20 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
1df30 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
1df40 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
1df50 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
1df60 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
1df70 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
1df80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1df90 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
1dfa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dfb0 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
1dfc0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
1dfd0 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e  x, int sz){.  in
1dfe0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
1dff0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1e000 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
1e010 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
1e020 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
1e030 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
1e040 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
1e050 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
1e060 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
1e070 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
1e080 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
1e090 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
1e0a0 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
1e0b0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
1e0c0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
1e0d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1e0e0 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
1e0f0 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
1e100 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1e110 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1e120 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1e130 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
1e140 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
1e150 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
1e160 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
1e170 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
1e180 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
1e190 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
1e1a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
1e1b0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
1e1c0 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
1e1d0 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
1e1e0 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
1e1f0 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
1e200 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
1e210 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
1e220 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
1e230 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
1e240 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
1e250 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1e260 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
1e270 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
1e280 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
1e290 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
1e2a0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
1e2b0 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
1e2c0 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
1e2d0 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
1e2e0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
1e2f0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
1e300 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
1e310 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
1e320 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
1e330 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
1e340 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
1e350 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
1e360 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
1e370 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
1e380 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
1e390 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
1e3a0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
1e3b0 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
1e3c0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
1e3d0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
1e3e0 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
1e3f0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
1e400 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
1e410 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
1e420 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
1e430 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
1e440 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
1e450 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
1e460 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
1e470 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
1e480 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
1e490 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
1e4a0 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
1e4b0 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
1e4c0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
1e4d0 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
1e4e0 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
1e4f0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
1e500 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
1e510 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
1e520 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
1e530 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1e540 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
1e550 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
1e560 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
1e570 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
1e580 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
1e590 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
1e5a0 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
1e5b0 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
1e5c0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
1e5d0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
1e5e0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
1e5f0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
1e600 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
1e610 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
1e620 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
1e630 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
1e640 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
1e650 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
1e660 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
1e670 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
1e680 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
1e690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1e6a0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
1e6b0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
1e6c0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
1e6d0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
1e6e0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
1e6f0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
1e700 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
1e710 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
1e720 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
1e730 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
1e740 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
1e750 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
1e760 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
1e770 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
1e780 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
1e790 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
1e7a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1e7b0 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
1e7c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1e7d0 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
1e7e0 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
1e7f0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
1e800 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
1e810 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
1e820 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
1e830 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
1e840 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
1e850 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e860 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
1e870 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
1e880 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
1e890 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
1e8a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e8b0 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
1e8c0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
1e8d0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
1e8e0 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
1e8f0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
1e900 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
1e910 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
1e920 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1e930 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
1e940 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
1e950 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
1e960 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
1e970 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
1e980 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
1e990 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
1e9a0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
1e9b0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
1e9c0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
1e9d0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
1e9e0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1e9f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1ea00 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1ea10 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1ea20 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1ea30 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
1ea40 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
1ea50 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
1ea60 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
1ea70 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
1ea80 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
1ea90 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
1eaa0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
1eab0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
1eac0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
1ead0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
1eae0 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  <sizeof(pPage->a
1eaf0 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
1eb00 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b  ge->aOvfl[0]) );
1eb10 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
1eb20 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
1eb30 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
1eb40 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b  Ovfl[j].idx = i;
1eb50 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
1eb60 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1eb70 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
1eb80 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
1eb90 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
1eba0 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
1ebb0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
1ebc0 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
1ebd0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
1ebe0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
1ebf0 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
1ec00 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
1ec10 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
1ec20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
1ec30 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
1ec40 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
1ec50 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66 72 61    int rc = defra
1ec60 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
1ec70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ec80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1ec90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70  rn rc;.      top
1eca0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
1ecb0 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
1ecc0 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
1ecd0 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
1ece0 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
1ecf0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
1ed00 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
1ed10 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
1ed20 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
1ed30 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
1ed40 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  +5]) );.    pPag
1ed50 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
1ed60 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
1ed70 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
1ed80 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
1ed90 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
1eda0 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
1edb0 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
1edc0 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
1edd0 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
1ede0 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
1edf0 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
1ee00 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
1ee10 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
1ee20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
1ee30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
1ee40 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
1ee50 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
1ee60 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
1ee70 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
1ee80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ee90 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
1eea0 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
1eeb0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
1eec0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
1eed0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
1eee0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1eef0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
1ef00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
1ef10 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
1ef20 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
1ef30 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
1ef40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65       */.      Ce
1ef50 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1ef60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
1ef70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
1ef80 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1ef90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1efa0 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
1efb0 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
1efc0 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
1efd0 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20  Payload );.     
1efe0 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
1eff0 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
1f000 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
1f010 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1f020 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76       Pgno pgnoOv
1f030 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
1f040 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
1f050 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  low]);.        i
1f060 6e 74 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75  nt rc = ptrmapPu
1f070 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
1f080 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
1f090 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
1f0a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1f0b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f0c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f0d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
1f0e0 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
1f0f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f100 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
1f110 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
1f120 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
1f130 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
1f140 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
1f150 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
1f160 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
1f170 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
1f180 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
1f190 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
1f1a0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
1f1b0 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
1f1c0 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
1f1d0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
1f1e0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1f1f0 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
1f200 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1f210 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
1f220 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
1f230 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
1f240 20 69 6e 74 20 2a 61 53 69 7a 65 20 20 20 20 20   int *aSize     
1f250 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
1f260 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
1f270 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1f280 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1f290 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61  er */.  int tota
1f2a0 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74  lSize;    /* Tot
1f2b0 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
1f2c0 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ells */.  int hd
1f2d0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
1f2e0 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61  ndex of page hea
1f2f0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
1f300 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64  lptr;      /* Ad
1f310 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
1f320 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
1f330 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
1f340 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1f350 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
1f360 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
1f370 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
1f380 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  r the page */.. 
1f390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1f3a0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
1f3b0 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b    totalSize = 0;
1f3c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1f3d0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74  ell; i++){.    t
1f3e0 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a  otalSize += aSiz
1f3f0 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  e[i];.  }.  asse
1f400 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a  rt( totalSize+2*
1f410 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46  nCell<=pPage->nF
1f420 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ree );.  assert(
1f430 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
1f440 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20   );.  cellptr = 
1f450 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
1f460 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
1f470 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
1f480 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
1f490 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  et;.  put2byte(&
1f4a0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
1f4b0 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ll);.  if( nCell
1f4c0 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   ){.    cellbody
1f4d0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
1f4e0 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a  (pPage, totalSiz
1f4f0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
1f500 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20  cellbody>0 );.  
1f510 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1f520 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c  >nFree >= 2*nCel
1f530 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l );.    pPage->
1f540 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c  nFree -= 2*nCell
1f550 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1f560 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1f570 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
1f580 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c  ta[cellptr], cel
1f590 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65  lbody);.      me
1f5a0 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
1f5b0 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
1f5c0 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20   aSize[i]);.    
1f5d0 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a    cellptr += 2;.
1f5e0 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b        cellbody +
1f5f0 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
1f600 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  }.    assert( ce
1f610 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70  llbody==pPage->p
1f620 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
1f630 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
1f640 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a  Cell = nCell;.}.
1f650 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1f660 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
1f670 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
1f680 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
1f690 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
1f6a0 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
1f6b0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
1f6c0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1f6d0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
1f6e0 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
1f6f0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
1f700 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
1f710 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
1f720 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
1f730 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
1f740 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
1f750 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
1f760 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
1f770 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
1f780 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
1f790 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
1f7a0 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
1f7b0 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
1f7c0 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
1f7d0 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
1f7e0 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
1f7f0 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
1f800 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
1f810 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
1f820 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
1f830 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
1f840 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
1f850 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
1f860 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
1f870 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
1f880 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
1f890 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
1f8a0 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
1f8b0 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
1f8c0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
1f8d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
1f8e0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
1f8f0 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
1f900 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
1f910 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
1f920 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
1f930 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
1f940 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
1f950 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
1f960 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
1f970 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a  MemPage*, int);.
1f980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f990 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
1f9a0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
1f9b0 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
1f9c0 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
1f9d0 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
1f9e0 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
1f9f0 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
1fa00 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
1fa10 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
1fa20 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
1fa30 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
1fa40 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
1fa50 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
1fa60 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
1fa70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
1fa80 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
1fa90 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e   of trying balan
1faa0 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
1fab0 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
1fac0 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
1fad0 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
1fae0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
1faf0 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
1fb00 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
1fb10 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
1fb20 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
1fb30 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
1fb40 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
1fb50 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
1fb60 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
1fb70 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
1fb80 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
1fb90 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
1fba0 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
1fbb0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
1fbc0 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
1fbd0 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
1fbe0 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
1fbf0 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
1fc00 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
1fc10 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
1fc20 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
1fc30 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
1fc40 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
1fc50 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
1fc60 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
1fc70 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
1fc80 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
1fc90 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
1fca0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1fcb0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
1fcc0 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ck(MemPage *pPag
1fcd0 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  e, MemPage *pPar
1fce0 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
1fcf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
1fd00 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
1fd10 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
1fd20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65  int szCell;.  Ce
1fd30 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42  llInfo info;.  B
1fd40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fd50 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
1fd60 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61   parentIdx = pPa
1fd70 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f  rent->nCell;   /
1fd80 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69  * pParent new di
1fd90 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78  vider cell index
1fda0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
1fdb0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1fdc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1fdd0 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  of new divider c
1fde0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65  ell */.  u8 pare
1fdf0 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20  ntCell[64];     
1fe00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1fe10 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
1fe20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
1fe30 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1fe40 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72   new page. Inser
1fe50 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  t the overflow c
1fe60 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20  ell from pPage. 
1fe70 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65   ** into it. The
1fe80 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65  n remove the ove
1fe90 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
1fea0 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  pPage..  */.  rc
1feb0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1fec0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
1fed0 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
1fee0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1fef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1ff00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
1ff10 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
1ff20 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73  fl[0].pCell;.  s
1ff30 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
1ff40 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1ff50 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  );.  zeroPage(pN
1ff60 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
1ff70 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65  [0]);.  assemble
1ff80 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
1ff90 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
1ffa0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
1ffb0 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  ow = 0;..  /* Se
1ffc0 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  t the parent of 
1ffd0 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1ffe0 74 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72  ted page to pPar
1fff0 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  ent. */.  pNew->
20000 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
20010 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
20020 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
20030 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50  bPage);..  /* pP
20040 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
20050 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
20060 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
20070 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f  nge this.  ** so
20080 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
20090 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77  child is the new
200a0 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   page allocated 
200b0 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70  above and.  ** p
200c0 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74  Page is the next
200d0 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e  -to-right child.
200e0 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
200f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
20100 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  );.  pCell = fin
20110 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
20120 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
20130 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
20140 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
20150 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
20160 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
20170 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
20180 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
20190 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
201a0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28  rentSize);.  if(
201b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
201c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
201d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
201e0 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a  arentSize<64 );.
201f0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
20200 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  l(pParent, paren
20210 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c  tIdx, parentCell
20220 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c  , parentSize, 0,
20230 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   4);.  if( rc!=S
20240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20250 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
20260 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
20270 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
20280 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70  nt,parentIdx), p
20290 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70  Page->pgno);.  p
202a0 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
202b0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
202c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
202d0 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65  gnoNew);..#ifnde
202e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
202f0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66  TOVACUUM.  /* If
20300 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
20310 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
20320 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
20330 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69  nter map.  ** wi
20340 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
20350 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
20360 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
20370 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c  m the .  ** cell
20380 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
20390 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
203a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
203b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
203c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
203d0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
203e0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
203f0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
20400 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20420 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
20430 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d  (pNew, 0);.    }
20440 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20460 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
20470 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20480 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rc;.    }.  }.#e
20490 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ndif..  /* Relea
204a0 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
204b0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
204c0 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65   and balance the
204d0 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20   parent page,.  
204e0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64  ** in case the d
204f0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65  ivider cell inse
20500 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74  rted caused it t
20510 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
20520 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  l..  */.  releas
20530 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72  ePage(pNew);.  r
20540 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50  eturn balance(pP
20550 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e  arent, 0);.}.#en
20560 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
20570 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
20580 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
20590 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
205a0 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50  utes Cells on pP
205b0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e  age and up to NN
205c0 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f  *2 siblings.** o
205d0 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20  f pPage so that 
205e0 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
205f0 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d  bout the same am
20600 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
20610 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e  ce..** Usually N
20620 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
20630 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
20640 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68  ge is used in th
20650 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20  e balancing,.** 
20660 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c  though more sibl
20670 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
20680 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66  from one side if
20690 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69   pPage is the fi
206a0 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63  rst.** or last c
206b0 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
206c0 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61  nt.  If pPage ha
206d0 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e  s fewer than 2*N
206e0 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73  N siblings.** (s
206f0 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
20700 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
20710 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72  f pPage is the r
20720 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a  oot page or a .*
20730 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29  * child of root)
20740 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
20750 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72  ble siblings par
20760 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
20770 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a  balancing..**.**
20780 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
20790 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
207a0 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
207b0 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
207c0 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77   by one or.** tw
207d0 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
207e0 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
207f0 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
20800 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20   over full. The 
20810 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
20820 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61  special and is a
20830 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61  llowed to be nea
20840 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50  rly empty. If pP
20850 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72  age is .** the r
20860 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
20870 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
20880 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e  tree might be in
20890 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65  creased.** or de
208a0 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20  creased by one, 
208b0 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f  as necessary, to
208c0 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70   keep the root p
208d0 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  age from being.*
208e0 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f  * overfull or co
208f0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
20900 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
20910 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
20920 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
20930 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f  e of the Cells o
20940 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  n pPage.** might
20950 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
20960 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
20970 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73  ->aData[].  This
20980 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
20990 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
209a0 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66  erfull.  Part of
209b0 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   the job of this
209c0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a   routine is to.*
209d0 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * make sure all 
209e0 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20  Cells for pPage 
209f0 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69  once again fit i
20a00 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
20a10 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
20a20 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
20a30 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ng the siblings 
20a40 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61  of pPage, the pa
20a50 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a  rent of pPage.**
20a60 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76   might become ov
20a70 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
20a80 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61  ull.  If that ha
20a90 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73  ppens, then this
20aa0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
20ab0 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
20ac0 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e  y on the parent.
20ad0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  .**.** If this r
20ae0 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72  outine fails for
20af0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20   any reason, it 
20b00 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20  might leave the 
20b10 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61  database.** in a
20b20 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65   corrupted state
20b30 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
20b40 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
20b50 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
20b60 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
20b70 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
20b80 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  t balance_nonroo
20b90 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  t(MemPage *pPage
20ba0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
20bb0 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
20bc0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
20bd0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74  of pPage */.  Bt
20be0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
20bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c00 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
20c10 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
20c20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20c30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20c40 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
20c50 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
20c60 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
20c70 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
20c80 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
20c90 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
20ca0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
20cd0 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
20ce0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  */.  int nNew;  
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
20d10 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
20d20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20  */.  int nDiv;  
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
20d50 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20  ells in apDiv[] 
20d60 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
20d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20d80 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20d90 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b  rs */.  int idx;
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
20dc0 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e   pPage in pParen
20dd0 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
20de0 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20  int nxDiv;      
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e00 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f  Next divider slo
20e10 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  t in pParent->aC
20e20 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ell[] */.  int r
20e30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
20e40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
20e50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
20e60 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69  int leafCorrecti
20e70 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
20e80 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
20e90 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20  leaf.  0 if not 
20ea0 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74  */.  int leafDat
20eb0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
20ec0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
20ed0 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20  ge is a leaf of 
20ee0 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
20ef0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
20f00 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
20f10 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50    /* Bytes in pP
20f20 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68  age beyond the h
20f30 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  eader */.  int p
20f40 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ageFlags;       
20f50 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
20f60 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
20f70 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  [0] */.  int sub
20f80 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20  total;          
20f90 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61        /* Subtota
20fa0 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65  l of bytes in ce
20fb0 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20  lls on one page 
20fc0 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20  */.  int iSpace 
20fd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20fe0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
20ff0 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
21000 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
21010 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
21020 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
21030 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
21040 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ings */.  Pgno p
21050 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  gnoOld[NB];     
21060 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
21070 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
21080 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  page in apOld[] 
21090 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
210a0 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
210b0 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
210c0 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
210d0 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
210e0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
210f0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
21100 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
21110 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
21120 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  ncing */.  Pgno 
21130 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  pgnoNew[NB+2];  
21140 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
21150 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
21160 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d   page in apNew[]
21170 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
21180 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
21190 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
211a0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
211b0 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
211c0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
211d0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
211e0 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
211f0 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
21200 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
21210 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
21220 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
21230 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
21240 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
21250 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
21260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21270 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
21280 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
21290 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  nt *szCell;     
212a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
212b0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
212c0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
212d0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70  [] */.  u8 *aCop
212e0 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  y[NB];          
212f0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
21300 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f  r holding data o
21310 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20  f apCopy[] */.  
21320 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20  u8 *aSpace;     
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21340 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f  Space to hold co
21350 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
21360 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65   cells */.#ifnde
21370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
21380 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61  TOVACUUM.  u8 *a
21390 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  From = 0;.#endif
213a0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e  ..  /* .  ** Fin
213b0 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  d the parent pag
213c0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
213d0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
213e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
213f0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
21400 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
21410 61 67 65 29 20 29 3b 0a 20 20 70 42 74 20 3d 20  age) );.  pBt = 
21420 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50  pPage->pBt;.  pP
21430 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
21440 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
21450 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69  ( pParent );.  i
21460 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
21470 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21480 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70  Write(pParent->p
21490 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
214a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
214b0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
214c0 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
214d0 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
214e0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
214f0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23  rent->pgno));..#
21500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21510 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
21520 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63    /*.  ** A spec
21530 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20  ial case:  If a 
21540 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75  new entry has ju
21550 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
21560 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62   into a.  ** tab
21570 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62  le (that is, a b
21580 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65  tree with intege
21590 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64  r keys and all d
215a0 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65  ata at the leave
215b0 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  s).  ** and the 
215c0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65  new entry is the
215d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
215e0 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69  y in the tree (i
215f0 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c  t has the.  ** l
21600 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e  argest key) then
21610 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
21620 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
21630 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a   routine for.  *
21640 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61  * balancing.  ba
21650 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
21660 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64   much faster and
21670 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69   results in a ti
21680 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69  ghter.  ** packi
21690 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  ng of data in th
216a0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
216b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
216c0 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70  >leaf &&.      p
216d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a  Page->intKey &&.
216e0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61        pPage->lea
216f0 66 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70  fData &&.      p
21700 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
21710 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  =1 &&.      pPag
21720 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  e->aOvfl[0].idx=
21730 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  =pPage->nCell &&
21740 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50  .      pPage->pP
21750 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26  arent->pgno!=1 &
21760 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65  &.      get4byte
21770 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
21780 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
21790 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+8])==pPage->
217a0 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  pgno.  ){.    /*
217b0 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68  .    ** TODO: Ch
217c0 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73  eck the siblings
217d0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
217e0 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65  pPage. It may be
217f0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
21800 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61  y are not full a
21810 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69  nd no new page i
21820 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
21830 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61  */.    return ba
21840 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67  lance_quick(pPag
21850 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e, pParent);.  }
21860 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
21870 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c  ** Find the cell
21880 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
21890 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63  age whose left c
218a0 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b  hild points back
218b0 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20  .  ** to pPage. 
218c0 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61   The "idx" varia
218d0 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ble is the index
218e0 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20   of that cell.  
218f0 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73  If pPage.  ** is
21900 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63   the rightmost c
21910 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
21920 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20  then set idx to 
21930 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a  pParent->nCell .
21940 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
21950 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a  nt->idxShift ){.
21960 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
21970 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d     pgno = pPage-
21980 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
21990 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  t( pgno==sqlite3
219a0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
219b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
219c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30  );.    for(idx=0
219d0 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ; idx<pParent->n
219e0 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20  Cell; idx++){.  
219f0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
21a00 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
21a10 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29  t, idx))==pgno )
21a20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
21a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21a40 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
21a50 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20  Parent->nCell.  
21a60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65             || ge
21a70 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
21a80 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
21a90 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
21aa0 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno );.  }else{.
21ab0 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d      idx = pPage-
21ac0 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a  >idxParent;.  }.
21ad0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69  .  /*.  ** Initi
21ae0 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  alize variables 
21af0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
21b00 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a  be safe to jump.
21b10 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
21b20 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
21b30 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a   at any moment..
21b40 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e    */.  nOld = nN
21b50 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ew = 0;.  sqlite
21b60 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
21b70 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  t->pDbPage);..  
21b80 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62  /*.  ** Find sib
21b90 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50  ling pages to pP
21ba0 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  age and the cell
21bb0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61  s in pParent tha
21bc0 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68  t divide.  ** th
21bd0 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20  e siblings.  An 
21be0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
21bf0 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
21c00 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20  ngs on either.  
21c10 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  ** side of pPage
21c20 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  .  More siblings
21c30 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
21c40 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
21c50 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65  r, if.  ** pPage
21c60 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
21c70 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
21c80 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
21c90 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74  ide.  If pParent
21ca0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
21cb0 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
21cc0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
21cd0 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
21ce0 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78  taken..  */.  nx
21cf0 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a  Div = idx - NN;.
21d00 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42    if( nxDiv + NB
21d10 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   > pParent->nCel
21d20 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  l ){.    nxDiv =
21d30 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
21d40 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  - NB + 1;.  }.  
21d50 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20  if( nxDiv<0 ){. 
21d60 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
21d70 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20  }.  nDiv = 0;.  
21d80 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76  for(i=0, k=nxDiv
21d90 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b  ; i<NB; i++, k++
21da0 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61  ){.    if( k<pPa
21db0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
21dc0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
21dd0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
21de0 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76  , k);.      nDiv
21df0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
21e00 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66  ( !pParent->leaf
21e10 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   );.      pgnoOl
21e20 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
21e30 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  apDiv[i]);.    }
21e40 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72  else if( k==pPar
21e50 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
21e60 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
21e70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
21e80 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
21e90 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
21ea0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21ec0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
21ed0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
21ee0 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b  oOld[i], &apOld[
21ef0 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  i], pParent);.  
21f00 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
21f10 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
21f20 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69  .    apOld[i]->i
21f30 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20  dxParent = k;.  
21f40 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b    apCopy[i] = 0;
21f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
21f60 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64  nOld );.    nOld
21f70 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c  ++;.    nMaxCell
21f80 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
21f90 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
21fa0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a  >nOverflow;.  }.
21fb0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
21fc0 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
21fd0 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 2 in order to
21fe0 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
21ff0 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
22000 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
22010 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29   (nMaxCells + 1)
22020 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~1;..  /*.  ** 
22030 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
22040 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
22050 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65  ures.  */.  apCe
22060 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
22070 63 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e 4d  cRaw( .       nM
22080 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
22090 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
220b0 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
220c0 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
220d0 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20  of(int)         
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
22100 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a      + ROUND8(siz
22110 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42  eof(MemPage))*NB
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a        /* aCopy *
22140 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
22150 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20  geSize*(5+NB)   
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
22180 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53  ce */.     + (IS
22190 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61  AUTOVACUUM ? nMa
221a0 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20  xCells : 0)     
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
221c0 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20  aFrom */.  );.  
221d0 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
221e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
221f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
22200 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
22210 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
22220 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e   (int*)&apCell[n
22230 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f  MaxCells];.  aCo
22240 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a  py[0] = (u8*)&sz
22250 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
22260 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f  .  assert( ((aCo
22270 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[0] - (u8*)apC
22280 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
22290 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
222a0 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
222b0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b    for(i=1; i<NB;
222c0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79   i++){.    aCopy
222d0 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31  [i] = &aCopy[i-1
222e0 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
222f0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
22300 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73  mPage))];.    as
22310 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d  sert( ((aCopy[i]
22320 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
22330 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
22340 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
22350 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
22360 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79   aSpace = &aCopy
22370 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
22380 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
22390 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
223a0 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63   assert( ((aSpac
223b0 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  e - (u8*)apCell)
223c0 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
223d0 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
223e0 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e  required */.#ifn
223f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22400 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
22410 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
22420 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20   ){.    aFrom = 
22430 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70  &aSpace[5*pBt->p
22440 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65  ageSize];.  }.#e
22450 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  ndif.  .  /*.  *
22460 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
22470 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
22480 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
22490 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
224a0 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
224b0 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
224c0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
224d0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
224e0 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
224f0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
22500 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
22510 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
22520 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
22530 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
22540 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
22550 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
22560 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
22570 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
22580 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
22590 61 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70  age*)&aCopy[i][p
225a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
225b0 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28     p->aData = &(
225c0 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61  (u8*)p)[-pBt->pa
225d0 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d  geSize];.    mem
225e0 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70  cpy(p->aData, ap
225f0 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
22600 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73  Bt->pageSize + s
22610 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
22620 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63  .    /* The memc
22630 70 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67  py() above chang
22640 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
22650 70 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68  p->aData so we h
22660 61 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65  ave to.    ** se
22670 74 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  t it again. */. 
22680 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28     p->aData = &(
22690 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61  (u8*)p)[-pBt->pa
226a0 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20  geSize];.  }..  
226b0 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
226c0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
226d0 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
226e0 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
226f0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
22700 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
22710 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
22720 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
22730 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
22740 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
22750 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
22760 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  pace[] and remov
22770 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
22780 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
22790 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
227a0 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
227b0 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
227c0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
227d0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
227e0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
227f0 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
22800 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
22810 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
22820 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
22830 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e  * into aSpace[].
22840 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
22850 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
22860 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
22870 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
22880 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
22890 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
228a0 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
228b0 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
228c0 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
228d0 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
228e0 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
228f0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
22900 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
22910 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
22920 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
22930 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
22940 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
22950 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
22960 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
22970 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
22980 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
22990 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
229a0 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
229b0 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
229c0 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
229d0 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
229e0 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
229f0 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d  afData && pPage-
22a00 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30  >leaf;.  for(i=0
22a10 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
22a20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
22a30 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
22a40 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
22a50 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
22a60 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
22a70 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
22a80 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
22a90 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
22aa0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
22ab0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
22ac0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
22ad0 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
22ae0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
22af0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
22b00 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
22b10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22b20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
22b30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
22b40 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
22b50 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
22b60 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
22b70 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
22b80 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
22b90 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
22ba0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
22bb0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
22bc0 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
22bd0 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
22be0 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
22bf0 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
22c00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22c20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
22c30 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
22c40 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
22c50 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ld-1 ){.      in
22c60 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  t sz = cellSizeP
22c70 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
22c80 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
22c90 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
22ca0 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
22cb0 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
22cc0 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
22cd0 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
22ce0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
22cf0 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
22d00 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
22d10 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
22d20 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
22d30 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
22d40 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
22d50 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
22d60 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
22d70 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
22d80 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
22d90 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
22da0 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
22db0 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
22dc0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22dd0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
22de0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
22df0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22e00 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
22e10 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
22e20 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
22e30 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
22e40 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
22e50 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
22e60 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
22e70 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
22e80 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
22e90 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
22ea0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
22eb0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
22ec0 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
22ed0 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  ], sz);.        
22ee0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
22ef0 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
22f00 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51  tion;.#ifndef SQ
22f10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22f20 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  CUUM.        if(
22f30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
22f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
22f50 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
22f60 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  F;.        }.#en
22f70 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70  dif.        drop
22f80 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
22f90 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
22fa0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
22fb0 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  -= leafCorrectio
22fc0 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
22fd0 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
22fe0 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
22ff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
23000 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
23010 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
23020 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
23030 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
23040 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
23050 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
23060 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
23070 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
23080 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
23090 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
230a0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
230b0 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
230c0 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
230d0 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
230e0 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
230f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23100 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
23110 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
23120 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23130 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
23140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
23150 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
23160 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
23170 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
23180 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  /.            sz
23190 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
231a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
231b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
231c0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
231d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
231e0 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
231f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
23200 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
23210 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
23220 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
23230 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
23240 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
23250 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
23260 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
23270 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
23280 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
23290 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
232a0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
232b0 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
232c0 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
232d0 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
232e0 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
232f0 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
23300 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
23310 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
23320 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
23330 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
23340 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
23350 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
23360 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
23370 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
23380 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
23390 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
233a0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
233b0 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
233c0 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
233d0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
233e0 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
233f0 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
23400 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
23410 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
23420 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
23430 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
23440 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
23450 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
23460 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
23470 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
23480 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
23490 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
234a0 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
234b0 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
234c0 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
234d0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
234e0 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
234f0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
23500 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
23510 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
23520 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
23530 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
23540 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
23550 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
23560 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
23570 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
23580 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
23590 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
235a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
235b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
235c0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
235d0 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
235e0 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
235f0 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
23600 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
23610 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
23620 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
23630 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
23640 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
23650 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
23660 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
23670 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
23680 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
23690 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
236a0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
236b0 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
236c0 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
236d0 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
236e0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
236f0 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
23700 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
23710 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
23720 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
23730 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
23740 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
23750 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
23760 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
23770 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
23780 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
23790 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
237a0 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
237b0 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
237c0 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
237d0 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
237e0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
237f0 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
23800 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
23810 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
23820 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
23830 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
23840 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
23850 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
23860 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
23870 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
23880 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
23890 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
238a0 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
238b0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
238c0 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
238d0 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
238e0 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
238f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
23900 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
23910 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
23920 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
23930 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
23940 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
23950 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
23960 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
23970 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
23980 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
23990 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
239a0 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
239b0 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
239c0 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
239d0 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
239e0 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
239f0 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
23a00 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
23a10 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
23a20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
23a30 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
23a40 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
23a50 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
23a60 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
23a70 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
23a80 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
23a90 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
23aa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
23ab0 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
23ac0 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
23ad0 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
23ae0 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20  we are the.  ** 
23af0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
23b00 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
23b10 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
23b20 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
23b30 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
23b40 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
23b50 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
23b60 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
23b70 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
23b80 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
23b90 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
23ba0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
23bb0 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
23bc0 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
23bd0 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
23be0 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
23bf0 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
23c00 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
23c10 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
23c20 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
23c30 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
23c40 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
23c50 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
23c60 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
23c70 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
23c80 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
23c90 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
23ca0 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
23cb0 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
23cc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
23cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23ce0 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
23cf0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
23d00 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
23d10 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
23d20 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
23d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
23d40 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
23d50 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
23d60 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
23d70 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f  pgnoNew[i], pgno
23d80 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20  New[i-1], 0);.  
23d90 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
23da0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
23db0 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
23dc0 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
23dd0 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nNew++;.    }.  
23de0 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
23df0 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d   pageFlags);.  }
23e00 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
23e10 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
23e20 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
23e30 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
23e40 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
23e50 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  d ){.    rc = fr
23e60 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  eePage(apOld[i])
23e70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
23e80 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
23e90 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
23ea0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
23eb0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
23ec0 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
23ed0 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
23ee0 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
23ef0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
23f00 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
23f10 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
23f20 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
23f30 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
23f40 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
23f50 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
23f60 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
23f70 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
23f80 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
23f90 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
23fa0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
23fb0 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
23fc0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
23fd0 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
23fe0 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
23ff0 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
24000 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
24010 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
24020 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
24030 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
24040 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
24050 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
24060 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
24070 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
24080 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
24090 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
240a0 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
240b0 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
240c0 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
240d0 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
240e0 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
240f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
24100 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
24110 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
24120 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  i];.    int minI
24130 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
24140 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
24150 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65        if( pgnoNe
24160 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d  w[j]<(unsigned)m
24170 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
24180 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
24190 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
241a0 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
241b0 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
241c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
241d0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
241e0 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67  pT;.      t = pg
241f0 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  noNew[i];.      
24200 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
24210 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
24220 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b  = pgnoNew[minI];
24230 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
24240 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
24250 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e       pgnoNew[min
24260 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70  I] = t;.      ap
24270 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
24280 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
24290 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
242a0 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a  : %d %d %d  new:
242b0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
242c0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
242d0 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f  %d)\n",.    pgno
242e0 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c  Old[0], .    nOl
242f0 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31  d>=2 ? pgnoOld[1
24300 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  ] : 0,.    nOld>
24310 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20  =3 ? pgnoOld[2] 
24320 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77  : 0,.    pgnoNew
24330 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  [0], szNew[0],. 
24340 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e     nNew>=2 ? pgn
24350 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[1] : 0, nNe
24360 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
24370 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
24380 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20   ? pgnoNew[2] : 
24390 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
243a0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
243b0 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77  New>=4 ? pgnoNew
243c0 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  [3] : 0, nNew>=4
243d0 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
243e0 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70  .    nNew>=5 ? p
243f0 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e  gnoNew[4] : 0, n
24400 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
24410 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20  ] : 0));..  /*. 
24420 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
24430 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
24440 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
24450 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
24460 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
24470 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
24480 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
24490 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
244a0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
244b0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
244c0 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
244d0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
244e0 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
244f0 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
24500 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
24510 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
24520 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
24530 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69  >pgno==pgnoNew[i
24540 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  ] );.    assembl
24550 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
24560 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
24570 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
24580 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
24590 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
245a0 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
245b0 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
245c0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
245d0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23  verflow==0 );..#
245e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
245f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24600 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
24610 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
24620 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
24630 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
24640 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74  entries.    ** t
24650 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  hat point to the
24660 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
24670 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20  ere rearranged. 
24680 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65  These can be: le
24690 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72  ft.    ** childr
246a0 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65  en of cells, the
246b0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
246c0 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65  the page, or ove
246d0 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
246e0 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
246f0 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   cells..    */. 
24700 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
24710 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
24720 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65  for(k=j; k<cntNe
24730 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  w[i]; k++){.    
24740 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d      assert( k<nM
24750 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
24760 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d     if( aFrom[k]=
24770 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
24780 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[k]]->pgno!
24790 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
247a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
247b0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
247c0 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20  , k-j);.        
247d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
247e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
247f0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
24800 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
24810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
24830 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74  dif..    j = cnt
24840 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
24850 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
24860 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
24870 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
24880 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
24890 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
248a0 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
248b0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
248c0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
248d0 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26    if( i<nNew-1 &
248e0 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  & j<nCell ){.   
248f0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
24900 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
24910 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
24920 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
24930 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
24940 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
24950 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
24960 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
24970 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
24980 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
24990 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
249a0 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
249b0 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
249c0 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
249d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
249e0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09 2f  ( leafData ){../
249f0 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
24a00 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
24a10 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
24a20 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
24a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
24a40 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
24a50 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
24a60 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
24a70 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
24a80 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
24a90 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
24aa0 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
24ab0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
24ac0 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
24ad0 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
24ae0 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
24af0 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
24b00 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
24b10 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
24b20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71   j--;.        sq
24b30 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
24b40 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
24b50 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
24b60 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
24b70 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
24b80 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43  .        fillInC
24b90 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65  ell(pParent, pCe
24ba0 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
24bb0 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  , 0, 0, 0, &sz);
24bc0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
24bd0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
24be0 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
24bf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
24c00 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
24c10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
24c20 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
24c30 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54  -= 4;.        pT
24c40 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53  emp = &aSpace[iS
24c50 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  pace];.        i
24c60 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
24c70 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
24c80 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
24c90 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
24ca0 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
24cb0 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
24cc0 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
24cd0 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
24ce0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
24cf0 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
24d00 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
24d10 6e 64 20 69 74 27 73 20 72 65 70 6f 72 74 65 64  nd it's reported
24d20 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
24d30 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
24d40 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
24d50 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
24d60 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
24d70 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
24d80 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
24d90 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
24da0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
24db0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
24dc0 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
24dd0 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
24de0 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
24df0 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
24e00 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
24e10 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
24e20 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
24e30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
24e40 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
24e50 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
24e60 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
24e70 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
24e80 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
24e90 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
24ea0 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
24eb0 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
24ec0 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
24ed0 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
24ee0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
24ef0 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
24f00 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
24f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
24f20 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
24f30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
24f40 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
24f50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
24f60 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
24f70 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
24f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24f90 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
24fa0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
24fb0 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
24fc0 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20   pTemp, 4);.    
24fd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24fe0 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
24ff0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
25000 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
25010 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
25020 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77  ent,nxDiv), pNew
25030 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
25040 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
25050 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
25060 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
25070 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
25080 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
25090 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
250a0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
250b0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
250c0 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
250d0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
250e0 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
250f0 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
25100 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
25110 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
25120 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25130 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
25140 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61  uum && !leafData
25150 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25160 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
25170 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
25180 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
251a0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
251b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
251c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
251d0 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b  endif.      j++;
251e0 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
251f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
25200 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
25210 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
25220 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
25230 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
25240 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
25250 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  EAF)==0 ){.    m
25260 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
25270 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
25280 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
25290 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
252a0 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d   }.  if( nxDiv==
252b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
252c0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
252d0 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
252e0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
252f0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
25300 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
25310 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
25320 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
25330 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
25340 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
25350 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
25360 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
25370 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
25380 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
25390 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
253a0 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
253b0 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
253c0 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
253d0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
253e0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
253f0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
25400 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
25410 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
25420 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65    /*.  ** Repare
25430 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61  nt children of a
25440 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  ll cells..  */. 
25450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
25460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
25470 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
25480 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ges(apNew[i]);. 
25490 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
254a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
254b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
254c0 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
254d0 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
254e0 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
254f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
25500 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
25510 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
25520 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
25530 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
25540 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
25550 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
25560 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
25570 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
25580 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
25590 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
255a0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
255b0 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
255c0 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
255d0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
255e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
255f0 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
25600 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
25610 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a  pParent, 0);.  .
25620 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
25630 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
25640 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
25650 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
25660 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  teFree(apCell);.
25670 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
25680 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
25690 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
256a0 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
256b0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
256c0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
256d0 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
256e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
256f0 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28  arent);.  TRACE(
25700 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
25710 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
25720 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
25730 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
25740 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
25750 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
25760 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
25770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
25780 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
25790 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
257a0 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68  ge of a btree wh
257b0 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  en the root.** p
257c0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
257d0 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20  cells.  This is 
257e0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
257f0 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a  o make the tree.
25800 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20  ** shallower by 
25810 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  one level..*/.st
25820 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
25830 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61  _shallower(MemPa
25840 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
25850 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
25860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25870 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67  e only child pag
25880 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  e of pPage */.  
25890 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
258b0 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
258c0 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  pChild */.  int 
258d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
258e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
258f0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
25900 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
25910 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65  /* The main BTre
25940 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
25950 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61   int mxCellPerPa
25960 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
25970 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
25980 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67  of cells per pag
25990 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
259a0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
259b0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
259c0 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e   from pages bein
259d0 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
259e0 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  int *szCell;    
259f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a00 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
25a10 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73  l cells */..  as
25a20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
25a30 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
25a40 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
25a50 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20  l==0 );.  pBt = 
25a60 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78  pPage->pBt;.  mx
25a70 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58  CellPerPage = MX
25a80 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70  _CELL(pBt);.  ap
25a90 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
25aa0 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50 65  locRaw( mxCellPe
25ab0 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38  rPage*(sizeof(u8
25ac0 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 20  *)+sizeof(int)) 
25ad0 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
25ae0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
25af0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65  TE_NOMEM;.  szCe
25b00 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
25b10 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  ll[mxCellPerPage
25b20 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ];.  if( pPage->
25b30 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54  leaf ){.    /* T
25b40 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  he table is comp
25b50 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a  letely empty */.
25b60 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
25b70 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65  NCE: empty table
25b80 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
25b90 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
25ba0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
25bb0 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75  page is empty bu
25bc0 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e  t has one child.
25bd0 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
25be0 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
25bf0 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20  n from that one 
25c00 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72  child into the r
25c10 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a  oot page if it .
25c20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e      ** will fit.
25c30 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
25c40 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
25c50 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20  tree by one..   
25c60 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
25c70 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
25c80 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
25c90 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
25ca0 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69  le than.    ** i
25cb0 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
25cc0 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
25cd0 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
25ce0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
25cf0 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
25d00 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73  database fle), s
25d10 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  o it might not b
25d20 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61  e able to hold a
25d30 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  ll of the .    *
25d40 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75  * information cu
25d50 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65  rrently containe
25d60 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20  d in the child. 
25d70 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
25d80 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68  .    ** case, th
25d90 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  en do not do the
25da0 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76   transfer.  Leav
25db0 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65  e page 1 empty e
25dc0 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
25dd0 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
25de0 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  er to the child 
25df0 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64  page.  The child
25e00 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20   page becomes.  
25e10 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
25e20 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
25e30 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  e..    */.    pg
25e40 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
25e50 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
25e60 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
25e70 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
25e80 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
25e90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
25ea0 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33  noChild<=sqlite3
25eb0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
25ec0 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
25ed0 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r) );.    rc = s
25ee0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
25ef0 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ge(pPage->pBt, p
25f00 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c  gnoChild, &pChil
25f10 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 0);.    if( r
25f20 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
25f30 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
25f40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
25f50 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  o==1 ){.      rc
25f60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
25f70 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
25f80 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
25f90 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
25fa0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
25fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25fc0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
25fd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
25fe0 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
25ff0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
26000 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
26010 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
26020 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
26030 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
26040 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
26050 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
26060 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
26070 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
26080 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
26090 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
260a0 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
260b0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
260c0 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
260d0 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
260e0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
260f0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
26100 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
26110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26120 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
26130 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
26140 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
26150 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
26160 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
26170 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
26180 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
26190 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
261a0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
261b0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
261c0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
261d0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
261e0 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
261f0 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
26200 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
26210 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
26220 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
26230 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
26240 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
26250 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
26260 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
26270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26280 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
26290 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
262a0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
262b0 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
262c0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
262d0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
262e0 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
262f0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
26300 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
26310 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
26320 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
26330 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
26340 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
26350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
26360 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
26370 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
26380 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
26390 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
263a0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
263b0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
263c0 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
263d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
263e0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
263f0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  age, 0);.      a
26400 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
26410 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72  E_OK );.      fr
26420 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
26430 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
26440 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20  LANCE: transfer 
26450 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f  child %d into ro
26460 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot %d\n",.      
26470 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e          pChild->
26480 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e  pgno, pPage->pgn
26490 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
264a0 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
264b0 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20  dPages(pPage);. 
264c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
264d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
264e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
264f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26500 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
26510 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
26520 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
26530 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
26540 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20  >nCell; i++){ . 
26550 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
26560 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c  apPutOvfl(pPage,
26570 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
26580 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26590 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
265a0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
265b0 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ance;.        }.
265c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
265d0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21  ndif.    if( rc!
265e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
265f0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
26600 6c 61 6e 63 65 3b 0a 20 20 20 20 72 65 6c 65 61  lance;.    relea
26610 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
26620 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f    }.end_shallow_
26630 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74  balance:.  sqlit
26640 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  eFree(apCell);. 
26650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
26660 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
26670 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
26680 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
26690 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
266a0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
266b0 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
266c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
266d0 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
266e0 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
266f0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
26700 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
26710 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
26720 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
26730 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
26740 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
26750 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
26760 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
26770 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
26780 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
26790 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
267a0 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
267b0 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  *pPage){.  int r
267c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
267d0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
267e0 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
267f0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
26800 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
26810 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
26820 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
26830 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
26840 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
26850 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
26860 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
26870 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
26880 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
26890 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
268a0 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
268b0 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
268c0 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
268d0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
268e0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
268f0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
26900 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
26910 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
26920 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
26930 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
26940 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
26950 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
26960 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
26970 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20  t */.  int brk; 
26980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
26990 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
269a0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
269b0 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
269c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
269d0 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
269e0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
269f0 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74  rflow>0 );.  pBt
26a00 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
26a10 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
26a20 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43  reePage(pBt, &pC
26a30 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64  hild, &pgnoChild
26a40 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30  , pPage->pgno, 0
26a50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
26a60 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
26a70 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
26a80 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
26a90 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
26aa0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
26ab0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
26ac0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
26ad0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
26ae0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
26af0 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65    brk = get2byte
26b00 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
26b10 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64    cdata = pChild
26b20 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70  ->aData;.  memcp
26b30 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68  y(cdata, &data[h
26b40 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c  dr], pPage->cell
26b50 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
26b60 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65  nCell-hdr);.  me
26b70 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d  mcpy(&cdata[brk]
26b80 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
26b90 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20  ableSize-brk);. 
26ba0 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
26bb0 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
26bc0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
26bd0 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64  eInitPage(pChild
26be0 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  , pPage);.  if( 
26bf0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
26c00 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d  edeeper_out;.  m
26c10 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
26c20 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66  vfl, pPage->aOvf
26c30 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  l, pPage->nOverf
26c40 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65  low*sizeof(pPage
26c50 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
26c60 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
26c70 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  w = pPage->nOver
26c80 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69  flow;.  if( pChi
26c90 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
26ca0 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72  .    pChild->nFr
26cb0 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ee = 0;.  }.  as
26cc0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
26cd0 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ell==pPage->nCel
26ce0 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  l );.  zeroPage(
26cf0 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
26d00 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
26d10 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
26d20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
26d30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
26d40 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
26d50 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
26d60 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
26d70 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67  into %d\n", pPag
26d80 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  e->pgno, pChild-
26d90 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66  >pgno));.#ifndef
26da0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26db0 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
26dc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
26dd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
26de0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
26df0 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  Bt, pChild->pgno
26e00 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
26e10 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
26e20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26e30 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
26e40 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
26e50 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
26e60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
26e70 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
26e80 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20  pChild, i);.    
26e90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
26eb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26ec0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
26ed0 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  if.  rc = balanc
26ee0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64  e_nonroot(pChild
26ef0 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65  );..balancedeepe
26f00 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  r_out:.  release
26f10 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
26f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26f30 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74 68  .** Decide if th
26f40 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65 65  e page pPage nee
26f50 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
26f60 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67  d.  If balancing
26f70 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c   is.** required,
26f80 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70   call the approp
26f90 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
26fa0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
26fb0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d  ic int balance(M
26fc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
26fd0 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e  nt insert){.  in
26fe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26ff0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
27000 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
27010 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
27020 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
27030 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65   rc = balance_de
27040 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20  eper(pPage);.   
27050 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
27060 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
27070 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
27080 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
27090 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67  e_shallower(pPag
270a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
270b0 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
270c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
270d0 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73 65   .        (!inse
270e0 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  rt && pPage->nFr
270f0 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ee>pPage->pBt->u
27100 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29  sableSize*2/3) )
27110 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
27120 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61  ance_nonroot(pPa
27130 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
27140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27150 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27160 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72  e checks all cur
27170 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20  sors that point 
27180 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f  to table pgnoRoo
27190 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  t..** If any of 
271a0 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65  those cursors we
271b0 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  re opened with w
271c0 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69  rFlag==0 in a di
271d0 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  fferent.** datab
271e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28  ase connection (
271f0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
27200 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65  ction that share
27210 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  s the pager.** c
27220 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75  ache with the cu
27230 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
27240 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72  ) and that other
27250 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
27260 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65  is not in the Re
27270 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73  adUncommmitted s
27280 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20  tate, then this 
27290 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
272a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .** SQLITE_LOCKE
272b0 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69  D..**.** In addi
272c0 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67  tion to checking
272d0 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20   for read-locks 
272e0 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c 6f  (where a read-lo
272f0 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63  ck .** means a c
27300 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69 74  ursor opened wit
27310 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68 69  h wrFlag==0) thi
27320 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d  s routine also m
27330 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74  oves.** all writ
27340 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61  e cursors so tha
27350 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  t they are point
27360 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
27370 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65  irst Cell on the
27380 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69   root page.  Thi
27390 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
273a0 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74  ecause an insert
273b0 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d   .** or delete m
273c0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
273d0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
273e0 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c  on a page or del
273f0 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e  ete.** a page en
27400 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f  tirely and we do
27410 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61   not want to lea
27420 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a  ve any cursors .
27430 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e  ** pointing to n
27440 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65  on-existant page
27450 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  s or cells..*/.s
27460 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
27470 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  eadLocks(Btree *
27480 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e  pBtree, Pgno pgn
27490 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  oRoot, BtCursor 
274a0 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74  *pExclude){.  Bt
274b0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53  Cursor *p;.  BtS
274c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74  hared *pBt = pBt
274d0 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  ree->pBt;.  sqli
274e0 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65  te3 *db = pBtree
274f0 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 66 6f 72  ->pSqlite;.  for
27500 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
27510 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
27520 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
27530 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
27540 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61  .    if( p->eSta
27550 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
27560 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27570 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
27580 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e  !=pgnoRoot ) con
27590 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
275a0 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a 20  ->wrFlag==0 ){. 
275b0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
275c0 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65  Other = p->pBtre
275d0 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20  e->pSqlite;.    
275e0 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30    if( dbOther==0
275f0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62   ||.         (db
27600 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62  Other!=db && (db
27610 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53  Other->flags & S
27620 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
27630 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  itted)==0) ){.  
27640 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27650 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
27660 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
27670 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  ( p->pPage->pgno
27680 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b  !=p->pgnoRoot ){
27690 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  .      moveToRoo
276a0 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(p);.    }.  }.
276b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
276c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
276d0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
276e0 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
276f0 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
27700 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
27710 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
27720 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
27730 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
27740 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
27750 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
27760 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
27770 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
27780 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
27790 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
277a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
277b0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
277c0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
277d0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
277e0 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
277f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
27800 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
27810 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
27820 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
27830 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
27840 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
27850 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  oth ignored..*/.
27860 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27870 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
27880 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
27890 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
278a0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
278b0 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
278c0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
278d0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
278e0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
278f0 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
27900 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
27910 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
27920 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
27930 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
27940 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
27950 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27970 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
27980 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
27990 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
279a0 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20  nt appendBias   
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279c0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
279d0 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
279e0 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
279f0 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69  ;.  int loc;.  i
27a00 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50  nt szNew;.  MemP
27a10 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
27a20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
27a30 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b  ur->pBtree->pBt;
27a40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27a50 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
27a60 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
27a70 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
27a80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
27a90 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
27aa0 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
27ab0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
27ac0 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
27ad0 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  an insert */.   
27ae0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
27af0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
27b00 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
27b10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
27b20 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
27b30 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70  Only );.  if( !p
27b40 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
27b50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27b60 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73  _PERM;   /* Curs
27b70 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20  or not open for 
27b80 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
27b90 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
27ba0 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
27bb0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
27bc0 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
27bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
27be0 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
27bf0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
27c00 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
27c10 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61   */.  }..  /* Sa
27c20 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
27c30 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
27c40 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
27c50 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c  is table */.  cl
27c60 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
27c70 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a  n(pCur);.  if( .
27c80 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
27c90 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
27ca0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
27cb0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20  gnoRoot, pCur)) 
27cc0 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ||.    SQLITE_OK
27cd0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
27ce0 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
27cf0 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
27d00 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
27d10 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
27d20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
27d30 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
27d40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
27d50 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
27d60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27d70 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
27d80 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
27d90 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  );.  TRACE(("INS
27da0 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
27db0 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
27dc0 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
27dd0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
27de0 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
27df0 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
27e00 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
27e10 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
27e20 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
27e30 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
27e40 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
27e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27e60 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
27e70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
27e80 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27e90 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69 74   newCell = sqlit
27ea0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43  eMallocRaw( MX_C
27eb0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
27ec0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
27ed0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
27ee0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
27ef0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
27f00 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
27f10 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
27f20 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
27f30 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
27f40 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
27f50 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
27f60 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
27f70 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
27f80 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
27f90 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
27fa0 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
27fb0 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
27fc0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
27fd0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f  e ){.    int szO
27fe0 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
27ff0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
28000 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
28010 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c  >nCell );.    ol
28020 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
28030 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
28040 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
28050 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
28060 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
28070 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
28080 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
28090 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
280a0 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
280b0 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
280c0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
280d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
280e0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
280f0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
28100 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73  ge, pCur->idx, s
28110 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zOld);.  }else i
28120 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
28130 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
28140 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28150 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75  >leaf );.    pCu
28160 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43  r->idx++;.    pC
28170 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
28180 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
28190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
281a0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
281b0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
281c0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
281d0 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
281e0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
281f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
28200 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
28210 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
28220 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c  ge, 1);.  /* sql
28230 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d  ite3BtreePageDum
28240 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75  p(pCur->pBt, pCu
28250 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  r->pgnoRoot, 1);
28260 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28   */.  /* fflush(
28270 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66  stdout); */.  if
28280 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28290 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
282a0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
282b0 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74  _insert:.  sqlit
282c0 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a  eFree(newCell);.
282d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
282e0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
282f0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
28300 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
28310 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
28320 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
28330 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
28340 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
28350 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28360 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
28370 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
28380 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
28390 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
283a0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
283b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
283c0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
283d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
283e0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
283f0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
28400 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
28410 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
28420 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
28430 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
28440 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
28450 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
28460 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20   doing a delete 
28470 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
28480 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
28490 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
284a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
284b0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
284c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
284d0 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
284e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
284f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28500 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
28510 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
28520 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
28530 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
28540 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
28550 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28560 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
28570 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
28580 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
28590 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
285a0 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
285b0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
285c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
285d0 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
285e0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
285f0 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
28600 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
28610 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
28620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
28630 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
28640 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28  ursor position (
28650 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63  a no-op if the c
28660 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
28670 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  .  ** CURSOR_REQ
28680 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20  UIRESEEK state) 
28690 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73  and save the pos
286a0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
286b0 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a  her cursors .  *
286c0 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  * open on the sa
286d0 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63  me table. Then c
286e0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
286f0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  Write() on the p
28700 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
28710 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
28720 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
28730 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
28740 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
28750 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
28760 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20  (pCur))!=0 ||.  
28770 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
28780 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
28790 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
287a0 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
287b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
287c0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
287d0 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  age))!=0.  ){.  
287e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
287f0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
28800 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
28810 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  's page and leav
28820 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
28830 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
28840 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
28850 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
28860 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
28870 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
28880 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
28890 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
288a0 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
288b0 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20  .  */.  pCell = 
288c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
288d0 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66  pCur->idx);.  if
288e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
288f0 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
28900 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
28910 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
28920 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
28930 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
28940 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
28950 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
28960 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
28970 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61  * The entry we a
28980 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65  re about to dele
28990 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  te is not a leaf
289a0 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   so if we do not
289b0 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74  .    ** do somet
289c0 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61  hing we will lea
289d0 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20  ve a hole on an 
289e0 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20  internal page.. 
289f0 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f     ** We have to
28a00 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62   fill the hole b
28a10 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65  y moving in a ce
28a20 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20  ll from a leaf. 
28a30 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   The.    ** next
28a40 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20   Cell after the 
28a50 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  one to be delete
28a60 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  d is guaranteed 
28a70 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20  to exist and.   
28a80 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66   ** to be a leaf
28a90 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69   so we can use i
28aa0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74  t..    */.    Bt
28ab0 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a  Cursor leafCur;.
28ac0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
28ad0 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e  r *pNext;.    in
28ae0 74 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20 54 68  t szNext;  /* Th
28af0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
28b00 6e 67 20 69 73 20 77 72 6f 6e 67 3a 20 73 7a 4e  ng is wrong: szN
28b10 65 78 74 20 69 73 20 61 6c 77 61 79 73 20 0a 20  ext is always . 
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  ** initialized b
28b40 65 66 6f 72 65 20 75 73 65 2e 20 20 41 64 64 69  efore use.  Addi
28b50 6e 67 20 61 6e 20 65 78 74 72 61 20 69 6e 69 74  ng an extra init
28b60 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
28b70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
28b80 6f 20 73 69 6c 65 6e 63 65 20 74 68 65 20 63 6f  o silence the co
28b90 6d 70 69 6c 65 72 20 73 6c 6f 77 73 20 64 6f 77  mpiler slows dow
28ba0 6e 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  n the code. */. 
28bb0 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
28bc0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
28bd0 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b  r *tempCell = 0;
28be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
28bf0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b  age->leafData );
28c00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
28c10 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70  eGetTempCursor(p
28c20 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a  Cur, &leafCur);.
28c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28c40 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43  BtreeNext(&leafC
28c50 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ur, &notUsed);. 
28c60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28c70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
28c80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28c90 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61  rite(leafCur.pPa
28ca0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
28cb0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
28cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28cd0 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
28ce0 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
28cf0 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d  te internal from
28d00 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d   %d replace from
28d10 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
28d20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
28d30 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
28d40 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65  o, leafCur.pPage
28d50 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
28d60 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
28d70 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
28d80 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
28d90 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65  ell));.      pNe
28da0 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65  xt = findCell(le
28db0 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61  afCur.pPage, lea
28dc0 66 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20  fCur.idx);.     
28dd0 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
28de0 7a 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50  zePtr(leafCur.pP
28df0 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  age, pNext);.   
28e00 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
28e10 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a  LL_SIZE(pBt)>=sz
28e20 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20  Next+4 );.      
28e30 74 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74  tempCell = sqlit
28e40 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43  eMallocRaw( MX_C
28e50 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
28e60 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43  .      if( tempC
28e70 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
28e80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
28e90 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
28ea0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
28eb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28ec0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
28ed0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
28ee0 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e  dx, pNext-4, szN
28ef0 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c  ext+4, tempCell,
28f00 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
28f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28f20 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
28f30 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
28f40 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
28f50 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64  >idx), pgnoChild
28f60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  );.      rc = ba
28f70 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b  lance(pPage, 0);
28f80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
28f90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28fa0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c        dropCell(l
28fb0 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65  eafCur.pPage, le
28fc0 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78  afCur.idx, szNex
28fd0 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62  t);.      rc = b
28fe0 61 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70  alance(leafCur.p
28ff0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Page, 0);.    }.
29000 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 74      sqliteFree(t
29010 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 73 71  empCell);.    sq
29020 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
29030 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61  eTempCursor(&lea
29040 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fCur);.  }else{.
29050 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
29060 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
29070 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ete from leaf %d
29080 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72  \n",.       pCur
29090 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
290a0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64  e->pgno));.    d
290b0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
290c0 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
290d0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
290e0 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  ll));.    rc = b
290f0 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
29100 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
29110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29120 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
29130 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
29140 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
29150 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
29160 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
29170 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
29180 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
29190 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
291a0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
291b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
291c0 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
291d0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
291e0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
291f0 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
29200 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
29210 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
29220 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
29230 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
29240 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
29250 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
29260 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
29270 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
29280 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
29290 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
292a0 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
292b0 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
292d0 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
292e0 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
292f0 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
29300 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
29310 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
29320 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
29330 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
29340 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
29350 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
29360 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
29370 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
29380 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
29390 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
293a0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
293b0 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20  tion first */.  
293c0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
293d0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
293e0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
293f0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
29400 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
29410 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66  dOnly );..#ifdef
29420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
29430 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61  OVACUUM.  rc = a
29440 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
29450 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
29460 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
29470 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
29480 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66  n rc;.#else.  if
29490 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
294a0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
294b0 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20  noMove;      /* 
294c0 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65  Move a page here
294d0 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
294e0 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
294f0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
29500 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68  pPageMove; /* Th
29510 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  e page to move t
29520 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72  o. */..    /* Cr
29530 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  eating a new tab
29540 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20  le may probably 
29550 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
29560 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
29570 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  ase.    ** to ma
29580 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
29590 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20  new tables root 
295a0 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68  page. In case th
295b0 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20  is page turns.  
295c0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61    ** out to be a
295d0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
295e0 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72   delete all over
295f0 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61  flow page-map ca
29600 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64  ches.    ** held
29610 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   by open cursors
29620 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76  ..    */.    inv
29630 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
29640 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20  owCache(pBt);.. 
29650 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76     /* Read the v
29660 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20  alue of meta[3] 
29670 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
29680 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  e to determine w
29690 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  here the.    ** 
296a0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
296b0 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c   new table shoul
296c0 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73  d go. meta[3] is
296d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
296e0 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72  t-page.    ** cr
296f0 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f  eated so far, so
29700 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
29710 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31  ge is (meta[3]+1
29720 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
29730 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
29740 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67  etMeta(p, 4, &pg
29750 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
29760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29770 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29780 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20  pgnoRoot++;..   
29790 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74   /* The new root
297a0 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65  -page may not be
297b0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20   allocated on a 
297c0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
297d0 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
297e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67  PENDING_BYTE pag
297f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
29800 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
29810 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
29820 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
29830 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
29840 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
29850 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
29860 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
29870 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
29880 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
29890 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
298a0 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
298b0 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
298c0 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
298d0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
298e0 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
298f0 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
29900 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
29910 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
29920 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
29930 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
29940 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
29950 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
29960 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
29970 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
29980 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
29990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
299a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
299b0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
299c0 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
299d0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
299e0 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
299f0 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
29a00 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
29a10 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
29a20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
29a30 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
29a40 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
29a50 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
29a60 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
29a70 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
29a80 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
29a90 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
29aa0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
29ab0 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
29ac0 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
29ad0 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
29ae0 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
29af0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
29b00 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
29b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
29b20 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
29b30 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
29b40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
29b50 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
29b60 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
29b70 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
29b80 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
29b90 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
29ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
29bb0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
29bc0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
29bd0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
29be0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29bf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
29c00 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
29c10 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
29c20 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
29c30 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
29c40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
29c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54  =SQLITE_OK || eT
29c60 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
29c70 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  PAGE || eType==P
29c80 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
29c90 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
29ca0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
29cb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
29cd0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
29ce0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
29cf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
29d00 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45  Type!=PTRMAP_FRE
29d10 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72  EPAGE );.      r
29d20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29d30 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
29d40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
29d50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29d60 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
29d70 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
29d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
29da0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
29db0 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79  (pBt, pRoot, eTy
29dc0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67  pe, iPtrPage, pg
29dd0 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72  noMove);.      r
29de0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
29df0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
29e00 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
29e10 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
29e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29e40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29e50 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
29e60 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
29e70 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
29e80 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
29e90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29eb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29ec0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
29ed0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29ee0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
29ef0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29f10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
29f20 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
29f30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29f40 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
29f50 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
29f60 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
29f70 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
29f80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
29f90 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
29fa0 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
29fb0 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
29fc0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
29fd0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
29fe0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
29ff0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2a000 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2a010 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2a020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a030 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2a040 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2a050 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
2a060 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2a070 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2a080 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2a090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a0a0 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
2a0b0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2a0c0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
2a0d0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
2a0e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2a0f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a100 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
2a110 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2a120 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
2a130 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2a140 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
2a150 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
2a160 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
2a170 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
2a180 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
2a190 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
2a1a0 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
2a1b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a1c0 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
2a1d0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
2a1e0 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
2a1f0 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
2a200 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
2a210 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
2a220 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
2a230 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
2a240 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2a250 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
2a260 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
2a270 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2a280 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
2a290 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2a2a0 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
2a2b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2a2c0 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
2a2d0 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  nt page.  NULL f
2a2e0 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20  or the root */. 
2a2f0 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
2a300 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g      /* Deallo
2a310 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
2a320 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
2a330 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2a340 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
2a350 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2a360 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
2a370 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  pgno>sqlite3Page
2a380 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
2a390 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
2a3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2a3b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
2a3c0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2a3d0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
2a3e0 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74   &pPage, pParent
2a3f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2a400 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2a410 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
2a420 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
2a430 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
2a440 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2a450 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
2a460 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2a470 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
2a480 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2a490 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2a4a0 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61  ell), pPage->pPa
2a4b0 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rent, 1);.      
2a4c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2a4d0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2a4e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
2a4f0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2a500 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2a510 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2a520 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2a530 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
2a540 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2a550 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2a560 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2a570 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2a580 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67  >aData[8]), pPag
2a590 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2a5a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2a5b0 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2a5c0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69  age_out;.  }.  i
2a5d0 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  f( freePageFlag 
2a5e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
2a5f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
2a600 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
2a610 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a620 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2a630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f  )==0 ){.    zero
2a640 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
2a650 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
2a660 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
2a670 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2a680 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
2a690 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
2a6a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a6b0 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
2a6c0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
2a6d0 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
2a6e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
2a6f0 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
2a700 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2a710 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2a720 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
2a730 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2a740 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
2a750 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
2a760 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
2a770 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a780 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2a790 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2a7a0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2a7b0 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
2a7c0 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
2a7d0 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
2a7e0 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
2a7f0 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
2a800 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  of the table..*/
2a810 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2a820 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
2a830 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2a840 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
2a850 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2a860 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 2d 3e  ->pBt;.  if( p->
2a870 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2a880 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
2a890 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2a8a0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2a8b0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2a8c0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 68  R;.  }.  rc = ch
2a8d0 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20  eckReadLocks(p, 
2a8e0 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66  iTable, 0);.  if
2a8f0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2a900 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2a910 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2a920 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  on of all cursor
2a930 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
2a940 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 53 51  able */.  if( SQ
2a950 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2a960 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2a970 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29  t, iTable, 0)) )
2a980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2a990 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 63  .  }..  return c
2a9a0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2a9b0 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
2a9c0 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  le, 0, 0);.}../*
2a9d0 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e  .** Erase all in
2a9e0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74  formation in a t
2a9f0 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65  able and add the
2aa00 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2aa10 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65  le to.** the fre
2aa20 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20  elist.  Except, 
2aa30 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2aa40 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20  principle table 
2aa50 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70  (the one on.** p
2aa60 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20  age 1) is never 
2aa70 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2aa80 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  elist..**.** Thi
2aa90 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2aaa0 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2aab0 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2aac0 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2aad0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
2aae0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  able..**.** If A
2aaf0 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
2ab00 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  bled and the pag
2ab10 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e  e at iTable is n
2ab20 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72  ot the last.** r
2ab30 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
2ab40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
2ab50 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f  hen the last roo
2ab60 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68  t page .** in th
2ab70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ab80 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68  is moved into th
2ab90 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  e slot formerly 
2aba0 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69  occupied by.** i
2abb0 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c  Table and that l
2abc0 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  ast slot formerl
2abd0 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68  y occupied by th
2abe0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2abf0 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
2ac00 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73  the freelist ins
2ac10 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20  tead of iTable. 
2ac20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c   In this say, al
2ac30 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20  l.** root pages 
2ac40 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20  are kept at the 
2ac50 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
2ac60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2ac70 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65  which.** is nece
2ac80 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41  ssary for AUTOVA
2ac90 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67  CUUM to work rig
2aca0 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73  ht.  *piMoved is
2acb0 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20   set to the .** 
2acc0 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
2acd0 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20   used to be the 
2ace0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2acf0 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72  n the file befor
2ad00 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20  e.** the move.  
2ad10 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20  If no page gets 
2ad20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20  moved, *piMoved 
2ad30 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20  is set to 0..** 
2ad40 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  The last root pa
2ad50 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ge is recorded i
2ad60 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68  n meta[3] and th
2ad70 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65  e value of.** me
2ad80 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64  ta[3] is updated
2ad90 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
2ada0 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
2adb0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
2adc0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2add0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
2ade0 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2adf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2ae00 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
2ae10 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2ae20 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2ae30 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2ae40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  {.    return pBt
2ae50 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2ae60 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2ae70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2ae80 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
2ae90 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74  egal to drop a t
2aea0 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73  able if any curs
2aeb0 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  ors are open on 
2aec0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
2aed0 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  e. This is becau
2aee0 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  se in auto-vacuu
2aef0 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65  m mode the backe
2af00 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64  nd may.  ** need
2af10 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72   to move another
2af20 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69   root-page to fi
2af30 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62 79  ll a gap left by
2af40 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a   the deleted.  *
2af50 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20  * root page. If 
2af60 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
2af70 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70 61  as using this pa
2af80 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75  ge a problem wou
2af90 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a  ld .  ** occur..
2afa0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2afb0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
2afc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2afd0 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  KED;.  }..  rc =
2afe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2aff0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
2b000 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20  iTable, &pPage, 
2b010 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
2b020 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
2b030 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2b040 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  arTable(p, iTabl
2b050 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
2b060 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2b070 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
2b080 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70  rn rc;.  }..  *p
2b090 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69  iMoved = 0;..  i
2b0a0 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23  f( iTable>1 ){.#
2b0b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2b0c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2b0d0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2b0e0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Page);.    relea
2b0f0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23  sePage(pPage);.#
2b100 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74  else.    if( pBt
2b110 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2b120 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f        Pgno maxRo
2b130 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63  otPgno;.      rc
2b140 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2b150 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61  etMeta(p, 4, &ma
2b160 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
2b170 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2b190 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2b1a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2b1b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2b1c0 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
2b1d0 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
2b1e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2b1f0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
2b200 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
2b210 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
2b220 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2b230 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2b240 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
2b250 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
2b260 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
2b270 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
2b280 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
2b290 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2b2a0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2b2b0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2b2c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b2d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b2e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b2f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2b300 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2b310 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2b320 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
2b330 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
2b340 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
2b350 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
2b360 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
2b370 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
2b380 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
2b390 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
2b3a0 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
2b3b0 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e  leted root-page.
2b3c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b3d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f      MemPage *pMo
2b3e0 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  ve;.        rele
2b3f0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2b400 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b410 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2b420 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
2b430 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
2b440 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2b450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b460 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2b470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b480 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
2b490 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c  Page(pBt, pMove,
2b4a0 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
2b4b0 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  , 0, iTable);.  
2b4c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b4d0 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
2b4e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b4f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2b500 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2b520 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2b530 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
2b540 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c  ootPgno, &pMove,
2b550 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2b560 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b570 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2b580 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2b590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
2b5a0 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  eePage(pMove);. 
2b5b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2b5c0 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
2b5d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b5e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b5f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
2b610 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f  piMoved = maxRoo
2b620 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPgno;.      }..
2b630 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
2b640 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70   new 'max-root-p
2b650 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68  age' value in th
2b660 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
2b670 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  r. This.      **
2b680 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75   is the old valu
2b690 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73  e less one, less
2b6a0 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61   one more if tha
2b6b0 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20  t happens to.   
2b6c0 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d     ** be a root-
2b6d0 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73  page number, les
2b6e0 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74  s one again if t
2b6f0 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20  hat is the.     
2b700 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
2b710 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a  _PAGE..      */.
2b720 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
2b730 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  o--;.      if( m
2b740 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44  axRootPgno==PEND
2b750 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2b760 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  t) ){.        ma
2b770 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
2b780 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
2b790 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d  axRootPgno==PTRM
2b7a0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d  AP_PAGENO(pBt, m
2b7b0 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20  axRootPgno) ){. 
2b7c0 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
2b7d0 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
2b7e0 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78 52      assert( maxR
2b7f0 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47  ootPgno!=PENDING
2b800 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2b810 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  );..      rc = s
2b820 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
2b830 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52  eMeta(p, 4, maxR
2b840 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65  ootPgno);.    }e
2b850 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2b860 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2b870 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2b880 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
2b890 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
2b8a0 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  .    /* If sqlit
2b8b0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
2b8c0 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70   was called on p
2b8d0 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65  age 1. */.    ze
2b8e0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50 54  roPage(pPage, PT
2b8f0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2b900 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  F );.    release
2b910 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
2b920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
2b930 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
2b940 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  he meta-informat
2b950 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74  ion out of a dat
2b960 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74  abase file.  Met
2b970 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e  a[0].** is the n
2b980 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
2b990 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
2b9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2b9b0 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75  Meta[1].** throu
2b9c0 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20  gh meta[15] are 
2b9d0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
2b9e0 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65  e by higher laye
2b9f0 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  rs.  Meta[0].** 
2ba00 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
2ba10 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61  e others are rea
2ba20 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20  d/write..** .** 
2ba30 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72  The schema layer
2ba40 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61   numbers meta va
2ba50 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79  lues differently
2ba60 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61  .  At the schema
2ba70 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74  .** layer (and t
2ba80 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64  he SetCookie and
2ba90 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f   ReadCookie opco
2baa0 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20  des) the number 
2bab0 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73  of.** free pages
2bac0 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e   is not visible.
2bad0 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69    So Cookie[0] i
2bae0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65  s the same as Me
2baf0 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ta[1]..*/.int sq
2bb00 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2bb10 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
2bb20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29  idx, u32 *pMeta)
2bb30 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
2bb40 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  age;.  int rc;. 
2bb50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2bb60 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pP1;.  BtShared 
2bb70 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
2bb80 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d    /* Reading a m
2bb90 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72  eta-data value r
2bba0 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  equires a read-l
2bbb0 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61  ock on page 1 (a
2bbc0 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68  nd hence.  ** th
2bbd0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bbe0 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74  table. We grab t
2bbf0 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c  his lock regardl
2bc00 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2bc10 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53  r.  ** not the S
2bc20 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2bc30 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
2bc40 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  t (the table roo
2bc50 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a  ted at page.  **
2bc60 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73   1 is treated as
2bc70 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
2bc80 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  by queryTableLoc
2bc90 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c  k() and lockTabl
2bca0 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  e())..  */.  rc 
2bcb0 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
2bcc0 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
2bcd0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2bce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2bcf0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2bd00 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
2bd10 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72  & idx<=15 );.  r
2bd20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2bd30 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
2bd40 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   1, &pDbPage);. 
2bd50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2bd60 20 72 63 3b 0a 20 20 70 50 31 20 3d 20 28 75 6e   rc;.  pP1 = (un
2bd70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
2bd80 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
2bd90 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  a(pDbPage);.  *p
2bda0 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
2bdb0 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
2bdc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
2bdd0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
2bde0 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61  ..  /* If autova
2bdf0 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c  cuumed is disabl
2be00 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
2be10 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69   but we are tryi
2be20 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65  ng to .  ** acce
2be30 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d  ss an autovacuum
2be40 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
2be50 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62  n make the datab
2be60 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20  ase readonly. . 
2be70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2be80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2be90 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26  M.  if( idx==4 &
2bea0 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74  & *pMeta>0 ) pBt
2beb0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2bec0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61  #endif..  /* Gra
2bed0 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  b the read-lock 
2bee0 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
2bef0 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
2bf00 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
2bf10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bf20 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74  ./*.** Write met
2bf30 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61  a-information ba
2bf40 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
2bf50 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69  base.  Meta[0] i
2bf60 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61  s.** read-only a
2bf70 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72  nd may not be wr
2bf80 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  itten..*/.int sq
2bf90 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
2bfa0 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69  Meta(Btree *p, i
2bfb0 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74  nt idx, u32 iMet
2bfc0 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  a){.  BtShared *
2bfd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2bfe0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2bff0 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  P1;.  int rc;.  
2c000 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26  assert( idx>=1 &
2c010 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69  & idx<=15 );.  i
2c020 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
2c030 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2c040 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2c050 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2c060 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2c070 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
2c080 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
2c090 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d  e1!=0 );.  pP1 =
2c0a0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
2c0b0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
2c0c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
2c0d0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
2c0e0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
2c0f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 75 74  return rc;.  put
2c100 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20  4byte(&pP1[36 + 
2c110 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a  idx*4], iMeta);.
2c120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c130 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
2c140 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74  urn the flag byt
2c150 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  e at the beginni
2c160 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ng of the page t
2c170 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
2c180 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  * is currently p
2c190 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69  ointing to..*/.i
2c1a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2c1b0 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
2c1c0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2c1d0 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53   What about CURS
2c1e0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73  OR_REQUIRESEEK s
2c1f0 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e  tate? Probably n
2c200 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  eed to call.  **
2c210 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2c220 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
2c230 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d  here..  */.  Mem
2c240 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2c250 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72 65 74  ur->pPage;.  ret
2c260 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67  urn pPage ? pPag
2c270 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2c280 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a  hdrOffset] : 0;.
2c290 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
2c2a0 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
2c2b0 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
2c2c0 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
2c2d0 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
2c2e0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
2c2f0 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
2c300 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
2c310 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
2c320 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
2c330 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
2c340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c350 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
2c360 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
2c370 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
2c380 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2c390 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
2c3a0 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
2c3b0 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
2c3c0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
2c3d0 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
2c3e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
2c3f0 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
2c400 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2c410 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20  r *zMsg2;.  if( 
2c420 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29  !pCheck->mxErr )
2c430 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63   return;.  pChec
2c440 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43  k->mxErr--;.  pC
2c450 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  heck->nErr++;.  
2c460 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
2c470 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d  rmat);.  zMsg2 =
2c480 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
2c490 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
2c4a0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
2c4b0 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d  f( zMsg1==0 ) zM
2c4c0 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28 20  sg1 = "";.  if( 
2c4d0 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20  pCheck->zErrMsg 
2c4e0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c  ){.    char *zOl
2c4f0 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72  d = pCheck->zErr
2c500 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d  Msg;.    pCheck-
2c510 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
2c520 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
2c530 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72  ng(&pCheck->zErr
2c540 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c  Msg, zOld, "\n",
2c550 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28   zMsg1, zMsg2, (
2c560 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71  char*)0);.    sq
2c570 6c 69 74 65 46 72 65 65 28 7a 4f 6c 64 29 3b 0a  liteFree(zOld);.
2c580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
2c590 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2c5a0 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20  Check->zErrMsg, 
2c5b0 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63  zMsg1, zMsg2, (c
2c5c0 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73  har*)0);.  }.  s
2c5d0 71 6c 69 74 65 46 72 65 65 28 7a 4d 73 67 32 29  qliteFree(zMsg2)
2c5e0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2c5f0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2c600 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
2c610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c620 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2c630 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
2c640 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
2c650 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
2c660 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
2c670 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
2c680 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2c690 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
2c6a0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
2c6b0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
2c6c0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
2c6d0 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
2c6e0 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
2c6f0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
2c700 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
2c710 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
2c720 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
2c730 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
2c740 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
2c750 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
2c760 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
2c770 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
2c780 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
2c790 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61  , int iPage, cha
2c7a0 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
2c7b0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
2c7c0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
2c7d0 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
2c7e0 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b  ge || iPage<0 ){
2c7f0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
2c800 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
2c810 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70  text, "invalid p
2c820 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20  age number %d", 
2c830 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
2c840 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2c850 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
2c860 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63  age]==1 ){.    c
2c870 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2c880 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
2c890 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74  "2nd reference t
2c8a0 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  o page %d", iPag
2c8b0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
2c8c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20  ;.  }.  return  
2c8d0 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69  (pCheck->anRef[i
2c8e0 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23  Page]++)>1;.}..#
2c8f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c900 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
2c910 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
2c920 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  he entry in the 
2c930 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20  pointer-map for 
2c940 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73  page iChild maps
2c950 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61   to .** page iPa
2c960 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79  rent, pointer ty
2c970 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e  pe ptrType. If n
2c980 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72  ot, append an er
2c990 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74  ror message.** t
2c9a0 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  o pCheck..*/.sta
2c9b0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74  tic void checkPt
2c9c0 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74  rmap(.  Integrit
2c9d0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f  yCk *pCheck,   /
2c9e0 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
2c9f0 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  k context */.  P
2ca00 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2ca10 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70        /* Child p
2ca20 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
2ca30 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
2ca40 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
2ca50 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74  ed pointer map t
2ca60 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ype */.  Pgno iP
2ca70 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
2ca80 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
2ca90 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70  ter map parent p
2caa0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
2cab0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
2cac0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
2cad0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75  t description (u
2cae0 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73  sed for error ms
2caf0 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  g) */.){.  int r
2cb00 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54  c;.  u8 ePtrmapT
2cb10 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  ype;.  Pgno iPtr
2cb20 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63  mapParent;..  rc
2cb30 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68   = ptrmapGet(pCh
2cb40 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64  eck->pBt, iChild
2cb50 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20  , &ePtrmapType, 
2cb60 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b  &iPtrmapParent);
2cb70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2cb80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63  E_OK ){.    chec
2cb90 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2cba0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
2cbb0 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
2cbc0 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
2cbd0 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
2cbe0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
2cbf0 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
2cc00 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
2cc10 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
2cc20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2cc30 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2cc40 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
2cc50 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
2cc60 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
2cc70 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
2cc80 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
2cc90 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
2cca0 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
2ccb0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
2ccc0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
2ccd0 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
2cce0 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
2ccf0 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
2cd00 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
2cd10 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
2cd20 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2cd30 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
2cd40 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
2cd50 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
2cd60 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
2cd70 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
2cd80 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
2cd90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
2cda0 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
2cdb0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
2cdc0 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
2cdd0 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
2cde0 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
2cdf0 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
2ce00 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2ce10 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
2ce20 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
2ce30 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
2ce40 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
2ce50 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
2ce60 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
2ce70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
2ce80 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
2ce90 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
2cea0 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
2ceb0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
2cec0 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
2ced0 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
2cee0 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
2cef0 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
2cf00 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
2cf10 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
2cf20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2cf30 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
2cf40 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
2cf50 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
2cf60 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
2cf70 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
2cf80 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
2cf90 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
2cfa0 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
2cfb0 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
2cfc0 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
2cfd0 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
2cfe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2cff0 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
2d000 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
2d010 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
2d020 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
2d030 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
2d040 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
2d050 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
2d060 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
2d070 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2d080 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
2d090 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
2d0a0 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
2d0b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d0c0 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
2d0d0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
2d0e0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
2d0f0 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
2d100 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
2d110 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
2d120 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
2d130 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
2d140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d150 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2d160 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
2d170 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
2d180 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
2d190 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
2d1a0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
2d1b0 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
2d1c0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
2d1d0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
2d1e0 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
2d1f0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b  sableSize/4-8 ){
2d200 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
2d210 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2d220 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
2d230 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
2d240 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
2d250 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
2d260 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
2d270 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
2d280 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2d290 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
2d2a0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
2d2b0 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
2d2c0 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
2d2d0 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
2d2e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d2f0 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
2d300 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
2d310 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2d320 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
2d330 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
2d340 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
2d350 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
2d360 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
2d370 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2d380 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
2d390 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
2d3a0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
2d3b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
2d3c0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
2d3d0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
2d3e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2d3f0 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
2d400 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
2d410 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
2d420 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
2d430 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
2d440 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
2d450 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
2d460 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
2d470 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
2d480 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
2d490 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
2d4a0 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
2d4b0 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
2d4c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
2d4d0 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
2d4e0 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
2d4f0 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
2d500 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
2d510 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
2d520 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
2d530 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
2d540 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
2d550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2d560 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
2d570 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
2d580 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
2d590 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2d5a0 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
2d5b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2d5c0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
2d5d0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
2d5e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2d5f0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
2d600 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
2d610 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
2d620 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
2d630 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
2d640 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
2d650 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
2d660 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
2d670 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
2d680 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
2d690 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
2d6a0 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
2d6b0 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
2d6c0 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
2d6d0 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
2d6e0 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
2d6f0 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
2d700 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
2d710 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
2d720 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
2d730 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
2d740 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
2d750 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
2d760 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
2d770 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
2d780 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2d790 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
2d7a0 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
2d7b0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
2d7c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2d7d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
2d7e0 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
2d7f0 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
2d800 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
2d810 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
2d820 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
2d830 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
2d840 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
2d850 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
2d860 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
2d870 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
2d880 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
2d890 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
2d8a0 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
2d8b0 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
2d8c0 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
2d8d0 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
2d8e0 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
2d8f0 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
2d900 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
2d910 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
2d920 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
2d930 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
2d940 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
2d950 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
2d960 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2d970 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
2d980 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
2d990 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2d9a0 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
2d9b0 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
2d9c0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e  char *zParentCon
2d9d0 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20  text  /* Parent 
2d9e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
2d9f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2da00 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
2da10 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
2da20 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
2da30 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
2da40 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
2da50 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2da60 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
2da70 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
2da80 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
2da90 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74  r *hit;..  sqlit
2daa0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2dab0 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
2dac0 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
2dad0 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
2dae0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2daf0 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
2db00 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
2db10 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
2db20 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
2db30 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
2db40 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
2db50 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
2db60 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
2db70 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
2db80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2db90 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
2dba0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
2dbb0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
2dbc0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b  pPage, 0))!=0 ){
2dbd0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
2dbe0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
2dbf0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
2dc00 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
2dc10 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
2dc20 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
2dc30 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
2dc40 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
2dc50 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
2dc60 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d  age, pParent))!=
2dc70 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
2dc80 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2dc90 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73                "s
2dcb0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2dcc0 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72  age() returns er
2dcd0 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63  ror code %d", rc
2dce0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2dcf0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2dd00 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2dd10 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c  /* Check out all
2dd20 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   the cells..  */
2dd30 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20  .  depth = 0;.  
2dd40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
2dd50 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63  ->nCell && pChec
2dd60 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  k->mxErr; i++){.
2dd70 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
2dd80 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43     int sz;.    C
2dd90 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
2dda0 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c     /* Check payl
2ddb0 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  oad overflow pag
2ddc0 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  es.    */.    sq
2ddd0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2dde0 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c  izeof(zContext),
2ddf0 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
2de00 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65          "On tree
2de10 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
2de20 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
2de30 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2de40 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
2de50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
2de60 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2de70 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2de80 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
2de90 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
2dea0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
2deb0 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b  sz += info.nKey;
2dec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d  .    assert( sz=
2ded0 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
2dee0 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66  ;.    if( sz>inf
2def0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
2df00 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73    int nPage = (s
2df10 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  z - info.nLocal 
2df20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35  + usableSize - 5
2df30 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  )/(usableSize - 
2df40 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  4);.      Pgno p
2df50 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
2df60 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
2df70 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e  Overflow]);.#ifn
2df80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2df90 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2dfa0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2dfb0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
2dfc0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
2dfd0 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  ck, pgnoOvfl, PT
2dfe0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
2dff0 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
2e000 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2e010 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74  .      checkList
2e020 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f  (pCheck, 0, pgno
2e030 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f  Ovfl, nPage, zCo
2e040 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ntext);.    }.. 
2e050 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69     /* Check sani
2e060 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64  ty of left child
2e070 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2e080 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e090 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  af ){.      pgno
2e0a0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
2e0b0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2e0c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e0d0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
2e0e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2e0f0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
2e100 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
2e110 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2e120 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
2e130 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2e140 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63  .      d2 = chec
2e150 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
2e160 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e  ,pgno,pPage,zCon
2e170 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  text);.      if(
2e180 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74   i>0 && d2!=dept
2e190 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  h ){.        che
2e1a0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2e1b0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43  ck, zContext, "C
2e1c0 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20  hild page depth 
2e1d0 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20  differs");.     
2e1e0 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d   }.      depth =
2e1f0 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   d2;.    }.  }. 
2e200 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e210 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
2e220 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2e230 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2e240 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2e250 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2e260 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
2e270 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  t), zContext, . 
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e290 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20      "On page %d 
2e2a0 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20  at right child: 
2e2b0 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64  ", iPage);.#ifnd
2e2c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2e2d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2e2e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2e2f0 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  m ){.      check
2e300 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
2e310 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2e320 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20  E, iPage, 0);.  
2e330 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
2e340 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
2e350 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  eck, pgno, pPage
2e360 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  , zContext);.  }
2e370 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  . .  /* Check fo
2e380 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72  r complete cover
2e390 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a  age of the page.
2e3a0 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50    */.  data = pP
2e3b0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
2e3c0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2e3d0 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71  fset;.  hit = sq
2e3e0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75 73 61 62  liteMalloc( usab
2e3f0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
2e400 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  hit ){.    memse
2e410 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62 79  t(hit, 1, get2by
2e420 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2e430 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67  );.    nCell = g
2e440 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2e450 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53  r+3]);.    cellS
2e460 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20  tart = hdr + 12 
2e470 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
2e480 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2e490 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2e4a0 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32     int pc = get2
2e4b0 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53  byte(&data[cellS
2e4c0 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  tart+i*2]);.    
2e4d0 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c    int size = cel
2e4e0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2e4f0 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
2e500 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
2e510 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d  f( (pc+size-1)>=
2e520 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63  usableSize || pc
2e530 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
2e540 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2e550 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
2e560 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e       "Corruption
2e570 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c   detected in cel
2e580 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22  l %d on page %d"
2e590 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20  ,i,iPage,0);.   
2e5a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e5b0 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d    for(j=pc+size-
2e5c0 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68  1; j>=pc; j--) h
2e5d0 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d  it[j]++;.      }
2e5e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 63  .    }.    for(c
2e5f0 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74 65  nt=0, i=get2byte
2e600 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20  (&data[hdr+1]); 
2e610 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65 53  i>0 && i<usableS
2e620 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30 30  ize && cnt<10000
2e630 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63 6e  ; .           cn
2e640 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t++){.      int 
2e650 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
2e660 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20  &data[i+2]);.   
2e670 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2e680 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d  if( (i+size-1)>=
2e690 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c  usableSize || i<
2e6a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  0 ){.        che
2e6b0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2e6c0 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20 20  ck, 0,  .       
2e6d0 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e       "Corruption
2e6e0 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c   detected in cel
2e6f0 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22  l %d on page %d"
2e700 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20  ,i,iPage,0);.   
2e710 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e720 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31    for(j=i+size-1
2e730 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74  ; j>=i; j--) hit
2e740 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  [j]++;.      }. 
2e750 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79 74       i = get2byt
2e760 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20  e(&data[i]);.   
2e770 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74   }.    for(i=cnt
2e780 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a 65  =0; i<usableSize
2e790 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2e7a0 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20  ( hit[i]==0 ){. 
2e7b0 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
2e7c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69      }else if( hi
2e7d0 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  t[i]>1 ){.      
2e7e0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2e7f0 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20  (pCheck, 0,.    
2e800 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65 20        "Multiple 
2e810 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25 64  uses for byte %d
2e820 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69 2c   of page %d", i,
2e830 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
2e840 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2e850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e      }.    if( cn
2e860 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  t!=data[hdr+7] )
2e870 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
2e880 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
2e890 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46 72  , .          "Fr
2e8a0 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69  agmented space i
2e8b0 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72 74  s %d byte report
2e8c0 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67 65  ed as %d on page
2e8d0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2e8e0 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d  cnt, data[hdr+7]
2e8f0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  , iPage);.    }.
2e900 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
2e910 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73  (hit);..  releas
2e920 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e930 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a  return depth+1;.
2e940 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2e950 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2e960 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
2e970 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e980 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
2e990 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e9a0 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65  ne does a comple
2e9b0 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20  te check of the 
2e9c0 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65  given BTree file
2e9d0 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a  .  aRoot[] is.**
2e9e0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67   an array of pag
2e9f0 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20  es numbers were 
2ea00 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72  each page number
2ea10 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
2ea20 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e  e of.** a table.
2ea30 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e    nRoot is the n
2ea40 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2ea50 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   in aRoot..**.**
2ea60 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 63   If everything c
2ea70 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20  hecks out, this 
2ea80 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2ea90 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68  NULL.  If someth
2eaa0 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c  ing is.** amiss,
2eab0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2eac0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
2ead0 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
2eae0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a  d from malloc().
2eaf0 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ** and a pointer
2eb00 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d   to that error m
2eb10 65 73 73 61 67 65 20 69 73 20 72 65 74 75 72 6e  essage is return
2eb20 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ed.  The calling
2eb30 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
2eb40 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2eb50 66 72 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f  freeing the erro
2eb60 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69  r message when i
2eb70 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68  t is done..*/.ch
2eb80 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
2eb90 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a  IntegrityCheck(.
2eba0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
2ebb0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
2ebc0 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
2ebd0 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a  int *aRoot,   /*
2ebe0 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f   An array of roo
2ebf0 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  t pages numbers 
2ec00 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74  for individual t
2ec10 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rees */.  int nR
2ec20 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65  oot,    /* Numbe
2ec30 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
2ec40 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aRoot[] */.  int
2ec50 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74   mxErr,    /* St
2ec60 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72  op reporting err
2ec70 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d  ors after this m
2ec80 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  any */.  int *pn
2ec90 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Err    /* Write 
2eca0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2ecb0 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61   seen to this va
2ecc0 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  riable */.){.  i
2ecd0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66  nt i;.  int nRef
2ece0 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  ;.  IntegrityCk 
2ecf0 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72  sCheck;.  BtShar
2ed00 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2ed10 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69  ;..  nRef = sqli
2ed20 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
2ed30 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
2ed40 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69   if( lockBtreeWi
2ed50 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49  thRetry(p)!=SQLI
2ed60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
2ed70 75 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75 70  urn sqliteStrDup
2ed80 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75  ("Unable to acqu
2ed90 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ire a read lock 
2eda0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22  on the database"
2edb0 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  );.  }.  sCheck.
2edc0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68  pBt = pBt;.  sCh
2edd0 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74  eck.pPager = pBt
2ede0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65  ->pPager;.  sChe
2edf0 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  ck.nPage = sqlit
2ee00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2ee10 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b  (sCheck.pPager);
2ee20 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20  .  sCheck.mxErr 
2ee30 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63  = mxErr;.  sChec
2ee40 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a 70  k.nErr = 0;.  *p
2ee50 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65  nErr = 0;.#ifnde
2ee60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2ee70 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
2ee80 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b  Bt->nTrunc!=0 ){
2ee90 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  .    sCheck.nPag
2eea0 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b  e = pBt->nTrunc;
2eeb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2eec0 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d  ( sCheck.nPage==
2eed0 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  0 ){.    unlockB
2eee0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
2eef0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2ef00 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e  .  }.  sCheck.an
2ef10 52 65 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Ref = sqliteMall
2ef20 6f 63 52 61 77 28 20 28 73 43 68 65 63 6b 2e 6e  ocRaw( (sCheck.n
2ef30 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73  Page+1)*sizeof(s
2ef40 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20  Check.anRef[0]) 
2ef50 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b  );.  if( !sCheck
2ef60 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e  .anRef ){.    un
2ef70 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
2ef80 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45  d(pBt);.    *pnE
2ef90 72 72 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  rr = 1;.    retu
2efa0 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  rn sqlite3MPrint
2efb0 66 28 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c  f("Unable to mal
2efc0 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20 0a  loc %d bytes", .
2efd0 20 20 20 20 20 20 20 20 28 73 43 68 65 63 6b 2e          (sCheck.
2efe0 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
2eff0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
2f000 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
2f010 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ; i<=sCheck.nPag
2f020 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e  e; i++){ sCheck.
2f030 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a  anRef[i] = 0; }.
2f040 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59    i = PENDING_BY
2f050 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20  TE_PAGE(pBt);.  
2f060 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  if( i<=sCheck.nP
2f070 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63  age ){.    sChec
2f080 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a  k.anRef[i] = 1;.
2f090 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72    }.  sCheck.zEr
2f0a0 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rMsg = 0;..  /* 
2f0b0 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
2f0c0 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c  ity of the freel
2f0d0 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b  ist.  */.  check
2f0e0 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c  List(&sCheck, 1,
2f0f0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
2f100 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2f110 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
2f120 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
2f130 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2f140 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73  ), "Main freelis
2f150 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  t: ");..  /* Che
2f160 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65  ck all the table
2f170 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
2f180 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43  0; i<nRoot && sC
2f190 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29  heck.mxErr; i++)
2f1a0 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b  {.    if( aRoot[
2f1b0 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
2f1c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2f1d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2f1e0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2f1f0 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f  toVacuum && aRoo
2f200 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  t[i]>1 ){.      
2f210 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68  checkPtrmap(&sCh
2f220 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50  eck, aRoot[i], P
2f230 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2f240 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  0, 0);.    }.#en
2f250 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65  dif.    checkTre
2f260 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61  ePage(&sCheck, a
2f270 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73  Root[i], 0, "Lis
2f280 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a  t of tree roots:
2f290 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   ");.  }..  /* M
2f2a0 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70  ake sure every p
2f2b0 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
2f2c0 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20  is referenced.  
2f2d0 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
2f2e0 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26  =sCheck.nPage &&
2f2f0 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69   sCheck.mxErr; i
2f300 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
2f310 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2f320 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63  UM.    if( sChec
2f330 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b  k.anRef[i]==0 ){
2f340 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
2f350 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
2f360 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
2f370 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
2f380 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
2f390 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2f3a0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2f3b0 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72  vacuum, make sur
2f3c0 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74  e no tables cont
2f3d0 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  ain.    ** refer
2f3e0 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72  ences to pointer
2f3f0 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20  -map pages..    
2f400 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63  */.    if( sChec
2f410 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26  k.anRef[i]==0 &&
2f420 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50   .       (PTRMAP
2f430 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21  _PAGENO(pBt, i)!
2f440 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f  =i || !pBt->auto
2f450 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20  Vacuum) ){.     
2f460 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2f470 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67  &sCheck, 0, "Pag
2f480 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73  e %d is never us
2f490 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  ed", i);.    }. 
2f4a0 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
2f4b0 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20  Ref[i]!=0 && .  
2f4c0 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
2f4d0 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26  ENO(pBt, i)==i &
2f4e0 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  & pBt->autoVacuu
2f4f0 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
2f500 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
2f510 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20  ck, 0, "Pointer 
2f520 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20 72  map page %d is r
2f530 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a  eferenced", i);.
2f540 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2f550 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
2f560 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64   this analysis d
2f570 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79  id not leave any
2f580 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20   unref() pages. 
2f590 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65   */.  unlockBtre
2f5a0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
2f5b0 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71    if( nRef != sq
2f5c0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
2f5d0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
2f5e0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2f5f0 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
2f600 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61  , .      "Outsta
2f610 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74  nding page count
2f620 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f   goes from %d to
2f630 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73 20   %d during this 
2f640 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20  analysis",.     
2f650 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61   nRef, sqlite3Pa
2f660 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
2f670 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a  >pPager).    );.
2f680 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
2f690 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65   up and report e
2f6a0 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  rrors..  */.  sq
2f6b0 6c 69 74 65 46 72 65 65 28 73 43 68 65 63 6b 2e  liteFree(sCheck.
2f6c0 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72  anRef);.  *pnErr
2f6d0 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a   = sCheck.nErr;.
2f6e0 20 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b 2e    return sCheck.
2f6f0 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69  zErrMsg;.}.#endi
2f700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2f710 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2f720 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
2f730 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
2f740 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72  ame of the under
2f750 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
2f760 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
2f770 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
2f780 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65  GetFilename(Btre
2f790 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
2f7a0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
2f7b0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
2f7c0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
2f7d0 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
2f7e0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
2f7f0 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
2f800 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
2f810 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
2f820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f830 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2f840 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
2f850 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20  etDirname(Btree 
2f860 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
2f870 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
2f880 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
2f890 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
2f8a0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
2f8b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2f8c0 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
2f8d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2f8e0 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  le for this data
2f8f0 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e  base. The return
2f900 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69  .** value of thi
2f910 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2f920 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73   same regardless
2f930 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
2f940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2f950 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
2f960 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73   or not..*/.cons
2f970 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
2f980 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
2f990 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
2f9a0 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
2f9b0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
2f9c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
2f9d0 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d  erJournalname(p-
2f9e0 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
2f9f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2fa00 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
2fa10 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70  ** Copy the comp
2fa20 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
2fa30 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74  pBtFrom into pBt
2fa40 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  To.  A transacti
2fa50 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63  on.** must be ac
2fa60 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69  tive for both fi
2fa70 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  les..**.** The s
2fa80 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74 46  ize of file pBtF
2fa90 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75 63  rom may be reduc
2faa0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
2fab0 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74  tion..** If anyt
2fac0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
2fad0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2fae0 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20 72   on pBtFrom is r
2faf0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 69  olled back..*/.i
2fb00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2fb10 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70  opyFile(Btree *p
2fb20 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d  To, Btree *pFrom
2fb30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2fb40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20  LITE_OK;.  Pgno 
2fb50 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61 67  i, nPage, nToPag
2fb60 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74 53  e, iSkip;..  BtS
2fb70 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70  hared *pBtTo = p
2fb80 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61  To->pBt;.  BtSha
2fb90 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70  red *pBtFrom = p
2fba0 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69 66  From->pBt;..  if
2fbb0 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d  ( pTo->inTrans!=
2fbc0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70  TRANS_WRITE || p
2fbd0 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  From->inTrans!=T
2fbe0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2fbf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fc00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2fc10 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20   pBtTo->pCursor 
2fc20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2fc30 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65 20  BUSY;.  nToPage 
2fc40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
2fc50 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70  gecount(pBtTo->p
2fc60 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67 65 20  Pager);.  nPage 
2fc70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
2fc80 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d  gecount(pBtFrom-
2fc90 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69  >pPager);.  iSki
2fca0 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  p = PENDING_BYTE
2fcb0 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 20 20  _PAGE(pBtTo);.  
2fcc0 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
2fcd0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50 61  ITE_OK && i<=nPa
2fce0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  ge; i++){.    Db
2fcf0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
2fd00 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70 20     if( i==iSkip 
2fd10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2fd20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fd30 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50  rGet(pBtFrom->pP
2fd40 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67  ager, i, &pDbPag
2fd50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2fd60 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d   break;.    rc =
2fd70 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65   sqlite3PagerOve
2fd80 72 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50  rwrite(pBtTo->pP
2fd90 61 67 65 72 2c 20 69 2c 20 73 71 6c 69 74 65 33  ager, i, sqlite3
2fda0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
2fdb0 50 61 67 65 29 29 3b 0a 20 20 20 20 73 71 6c 69  Page));.    sqli
2fdc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
2fdd0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  bPage);.  }..  /
2fde0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
2fdf0 20 73 68 72 69 6e 6b 69 6e 67 2c 20 6a 6f 75 72   shrinking, jour
2fe00 6e 61 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  nal the pages th
2fe10 61 74 20 61 72 65 20 62 65 69 6e 67 20 74 72 75  at are being tru
2fe20 6e 63 61 74 65 64 0a 20 20 2a 2a 20 73 6f 20 74  ncated.  ** so t
2fe30 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
2fe40 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 74  rolled back if t
2fe50 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 2e  he commit fails.
2fe60 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 50  .  */.  for(i=nP
2fe70 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49 54  age+1; rc==SQLIT
2fe80 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50 61  E_OK && i<=nToPa
2fe90 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  ge; i++){.    Db
2fea0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
2feb0 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70 20     if( i==iSkip 
2fec0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2fed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fee0 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  rGet(pBtTo->pPag
2fef0 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29  er, i, &pDbPage)
2ff00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2ff10 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  reak;.    rc = s
2ff20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ff30 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 73  (pDbPage);.    s
2ff40 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
2ff50 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
2ff60 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20     /* Yeah.  It 
2ff70 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63  seems wierd to c
2ff80 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20  all DontWrite() 
2ff90 72 69 67 68 74 20 61 66 74 65 72 20 57 72 69 74  right after Writ
2ffa0 65 28 29 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  e().  But.    **
2ffb0 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73 65   that is because
2ffc0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
2ffd0 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20 64  ose procedures d
2ffe0 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a 20  o not exactly . 
2fff0 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20     ** represent 
30000 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20 57  what they do.  W
30010 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d 65  rite() really me
30020 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70 61  ans "put this pa
30030 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge in the.    **
30040 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
30050 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61 73  l and mark it as
30060 20 64 69 72 74 79 20 73 6f 20 74 68 61 74 20 69   dirty so that i
30070 74 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  t will be writte
30080 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  n.    ** to the 
30090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61  database file la
300a0 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65  ter."  DontWrite
300b0 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65  () undoes the se
300c0 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20  cond part of.   
300d0 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72 65   ** that and pre
300e0 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 20 66  vents the page f
300f0 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65  rom being writte
30100 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
30110 65 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  e.  The.    ** p
30120 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20  age is still on 
30130 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
30140 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41  rnal, though.  A
30150 6e 64 20 74 68 61 74 20 69 73 20 74 68 65 20 77  nd that is the w
30160 68 6f 6c 65 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  hole.    ** poin
30170 74 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 3a 20  t of this loop: 
30180 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20  to put pages on 
30190 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
301a0 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  rnal. */.    sql
301b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
301c0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69  DbPage);.  }.  i
301d0 66 28 20 21 72 63 20 26 26 20 6e 50 61 67 65 3c  f( !rc && nPage<
301e0 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 72  nToPage ){.    r
301f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30200 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e  Truncate(pBtTo->
30210 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
30220 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
30230 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
30240 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a  eRollback(pTo);.
30250 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30260 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53    .}.#endif /* S
30270 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
30280 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  M */../*.** Retu
30290 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
302a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
302b0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
302c0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
302d0 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  rans(Btree *p){.
302e0 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
302f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
30300 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a  S_WRITE));.}../*
30310 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
30320 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65  ero if a stateme
30330 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
30340 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
30350 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
30360 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
30370 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42  .  return (p->pB
30380 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53  t && p->pBt->inS
30390 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tmt);.}../*.** R
303a0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
303b0 66 20 61 20 72 65 61 64 20 28 6f 72 20 77 72 69  f a read (or wri
303c0 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  te) transaction 
303d0 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
303e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
303f0 49 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72 65  InReadTrans(Btre
30400 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
30410 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e  (p && (p->inTran
30420 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b  s!=TRANS_NONE));
30430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
30440 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
30450 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
30460 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
30470 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
30480 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65 64   a single shared
30490 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f  -btree. The memo
304a0 72 79 20 69 73 20 75 73 65 64 20 62 79 20 63 6c  ry is used by cl
304b0 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69 74  ient code for it
304c0 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73  's own.** purpos
304d0 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c  es (for example,
304e0 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68   to store a high
304f0 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73  -level schema as
30500 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
30510 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  * the shared-btr
30520 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c  ee). The btree l
30530 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66  ayer manages ref
30540 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20  erence counting 
30550 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  issues..**.** Th
30560 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
30570 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  s is called on a
30580 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e   shared-btree, n
30590 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d  Bytes bytes of m
305a0 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c  emory.** are all
305b0 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20  ocated, zeroed, 
305c0 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20  and returned to 
305d0 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20  the caller. For 
305e0 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
305f0 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79  .** call the nBy
30600 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  tes parameter is
30610 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70   ignored and a p
30620 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61  ointer to the sa
30630 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65  me blob.** of me
30640 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a  mory returned. .
30650 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72  **.** Just befor
30660 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  e the shared-btr
30670 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68  ee is closed, th
30680 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65  e function passe
30690 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72  d as the .** xFr
306a0 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e  ee argument when
306b0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
306c0 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20  cation was made 
306d0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  is invoked on th
306e0 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c  e .** blob of al
306f0 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20  located memory. 
30700 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
30710 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71  ould not call sq
30720 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a 20 6f 6e  liteFree().** on
30730 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65   the memory, the
30740 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65   btree layer doe
30750 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20  s that..*/.void 
30760 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68  *sqlite3BtreeSch
30770 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ema(Btree *p, in
30780 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a  t nBytes, void(*
30790 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b  xFree)(void *)){
307a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
307b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
307c0 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29   !pBt->pSchema )
307d0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65  {.    pBt->pSche
307e0 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ma = sqliteMallo
307f0 63 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 70  c(nBytes);.    p
30800 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
30810 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20 72  = xFree;.  }.  r
30820 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65  eturn pBt->pSche
30830 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ma;.}../*.** Ret
30840 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74  urn true if anot
30850 68 65 72 20 75 73 65 72 20 6f 66 20 74 68 65 20  her user of the 
30860 73 61 6d 65 20 73 68 61 72 65 64 20 62 74 72 65  same shared btre
30870 65 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  e as the argumen
30880 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64  t.** handle hold
30890 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
308a0 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74  ock on the sqlit
308b0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
308c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
308d0 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28  reeSchemaLocked(
308e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
308f0 75 72 6e 20 28 71 75 65 72 79 54 61 62 6c 65 4c  urn (queryTableL
30900 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
30910 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d  OT, READ_LOCK)!=
30920 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
30930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30940 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
30950 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
30960 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
30970 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  e whose root pag
30980 65 20 69 73 20 69 54 61 62 2e 20 20 54 68 65 0a  e is iTab.  The.
30990 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77 72 69  ** lock is a wri
309a0 74 65 20 6c 6f 63 6b 20 69 66 20 69 73 57 72 69  te lock if isWri
309b0 74 65 6c 6f 63 6b 20 69 73 20 74 72 75 65 20 6f  telock is true o
309c0 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a  r a read lock.**
309d0 20 69 66 20 69 74 20 69 73 20 66 61 6c 73 65 2e   if it is false.
309e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
309f0 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74  treeLockTable(Bt
30a00 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
30a10 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b  , u8 isWriteLock
30a20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
30a30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 6c 6f  LITE_OK;.  u8 lo
30a40 63 6b 54 79 70 65 20 3d 20 28 69 73 57 72 69 74  ckType = (isWrit
30a50 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f 43 4b  eLock?WRITE_LOCK
30a60 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72  :READ_LOCK);.  r
30a70 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
30a80 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b  ck(p, iTab, lock
30a90 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Type);.  if( rc=
30aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30ab0 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
30ac0 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
30ad0 70 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pe);.  }.  retur
30ae0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
30af0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30b00 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
30b10 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 73 72  ** Argument pCsr
30b20 20 6d 75 73 74 20 62 65 20 61 20 63 75 72 73 6f   must be a curso
30b30 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  r opened for wri
30b40 74 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49  ting on an .** I
30b50 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75 72 72  NTKEY table curr
30b60 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61  ently pointing a
30b70 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c 65 20  t a valid table 
30b80 65 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69 73 20  entry. .** This 
30b90 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65  function modifie
30ba0 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65  s the data store
30bb0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 61  d as part of tha
30bc0 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79  t entry..** Only
30bd0 20 74 68 65 20 64 61 74 61 20 63 6f 6e 74 65 6e   the data conten
30be0 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6d 6f  t may only be mo
30bf0 64 69 66 69 65 64 2c 20 69 74 20 69 73 20 6e 6f  dified, it is no
30c00 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  t possible.** to
30c10 20 63 68 61 6e 67 65 20 74 68 65 20 6c 65 6e 67   change the leng
30c20 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 73  th of the data s
30c30 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tored..*/.int sq
30c40 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61 74  lite3BtreePutDat
30c50 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72  a(BtCursor *pCsr
30c60 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
30c70 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a 29 7b  2 amt, void *z){
30c80 0a 0a 20 20 61 73 73 65 72 74 28 70 43 73 72 2d  ..  assert(pCsr-
30c90 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
30ca0 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  e);.  if( pCsr->
30cb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52  eState==CURSOR_R
30cc0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
30cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30ce0 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ABORT;.  }..  /*
30cf0 20 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65 63   Check some prec
30d00 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a 2a  onditions: .  **
30d10 20 20 20 28 61 29 20 74 68 65 20 63 75 72 73 6f     (a) the curso
30d20 72 20 69 73 20 6f 70 65 6e 20 66 6f 72 20 77 72  r is open for wr
30d30 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20 20 28 62  iting,.  **   (b
30d40 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 65  ) there is no re
30d50 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  ad-lock on the t
30d60 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69 66  able being modif
30d70 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  ied and.  **   (
30d80 63 29 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  c) the cursor po
30d90 69 6e 74 73 20 61 74 20 61 20 76 61 6c 69 64 20  ints at a valid 
30da0 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74 4b 65 79  row of an intKey
30db0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
30dc0 66 28 20 21 70 43 73 72 2d 3e 77 72 46 6c 61 67  f( !pCsr->wrFlag
30dd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
30de0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
30df0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
30e00 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Csr->pBtree->pBt
30e10 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20 20  ->readOnly .    
30e20 20 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e 70        && pCsr->p
30e30 42 74 72 65 65 2d 3e 70 42 74 2d 3e 69 6e 54 72  Btree->pBt->inTr
30e40 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
30e50 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
30e60 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
30e70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 73  Csr->pBtree, pCs
30e80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 73  r->pgnoRoot, pCs
30e90 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
30ea0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
30eb0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
30ec0 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
30ed0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
30ee0 20 7d 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65   }.  if( pCsr->e
30ef0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
30f00 56 41 4c 49 44 20 7c 7c 20 21 70 43 73 72 2d 3e  VALID || !pCsr->
30f10 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
30f20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30f30 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
30f40 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
30f50 79 6c 6f 61 64 28 70 43 73 72 2c 20 6f 66 66 73  yload(pCsr, offs
30f60 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
30f70 65 64 20 63 68 61 72 20 2a 29 7a 2c 20 30 2c 20  ed char *)z, 0, 
30f80 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65  1);.}../* .** Se
30f90 74 20 61 20 66 6c 61 67 20 6f 6e 20 74 68 69 73  t a flag on this
30fa0 20 63 75 72 73 6f 72 20 74 6f 20 63 61 63 68 65   cursor to cache
30fb0 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 6f   the locations o
30fc0 66 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  f pages from the
30fd0 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 6c 69   .** overflow li
30fe0 73 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  st for the curre
30ff0 6e 74 20 72 6f 77 2e 20 54 68 69 73 20 69 73 20  nt row. This is 
31000 75 73 65 64 20 62 79 20 63 75 72 73 6f 72 73 20  used by cursors 
31010 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f 72 20 69 6e  opened.** for in
31020 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49  cremental blob I
31030 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  O only..**.** Th
31040 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
31050 20 61 20 66 6c 61 67 20 6f 6e 6c 79 2e 20 54 68   a flag only. Th
31060 65 20 61 63 74 75 61 6c 20 70 61 67 65 20 6c 6f  e actual page lo
31070 63 61 74 69 6f 6e 20 63 61 63 68 65 0a 2a 2a 20  cation cache.** 
31080 28 73 74 6f 72 65 64 20 69 6e 20 42 74 43 75 72  (stored in BtCur
31090 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 29  sor.aOverflow[])
310a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
310b0 64 20 75 73 65 64 20 62 79 20 66 75 6e 63 74 69  d used by functi
310c0 6f 6e 0a 2a 2a 20 61 63 63 65 73 73 50 61 79 6c  on.** accessPayl
310d0 6f 61 64 28 29 20 28 74 68 65 20 77 6f 72 6b 65  oad() (the worke
310e0 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73  r function for s
310f0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
31100 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33  ) and.** sqlite3
31110 42 74 72 65 65 50 75 74 44 61 74 61 28 29 29 2e  BtreePutData()).
31120 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
31130 42 74 72 65 65 43 61 63 68 65 4f 76 65 72 66 6c  BtreeCacheOverfl
31140 6f 77 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ow(BtCursor *pCu
31150 72 29 7b 0a 20 20 61 73 73 65 72 74 28 21 70 43  r){.  assert(!pC
31160 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
31170 6e 64 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28  ndle);.  assert(
31180 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
31190 29 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 63  );.  pCur->isInc
311a0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b  rblobHandle = 1;
311b0 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.