/ Hex Artifact Content
Login

Artifact dca996d45f1b8a87c86d0ec22a7ef6ca8c1ab805:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 33 37 38 20 32 30 30 37 2f 30  c,v 1.378 2007/0
0190: 35 2f 30 38 20 31 34 3a 35 31 3a 33 37 20 64 72  5/08 14:51:37 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 53  EADER;.../*.** S
0330: 65 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76  et this global v
0340: 61 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20  ariable to 1 to 
0350: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75  enable tracing u
0360: 73 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a  sing the TRACE.*
0370: 2a 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20  * macro..*/.#if 
0380: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0390: 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72  sqlite3_btree_tr
03a0: 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20  ace=0;  /* True 
03b0: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
03c0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g */.#endif../*.
03d0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
03e0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
03f0: 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
0400: 63 6b 73 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c  cks(Btree*,Pgno,
0410: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 0a 23 69  BtCursor*);...#i
0420: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
0440: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63  /*.  ** The func
0450: 74 69 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65  tions queryTable
0460: 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c  Lock(), lockTabl
0470: 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c  e() and unlockAl
0480: 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d  lTables().  ** m
0490: 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65  anipulate entrie
04a0: 73 20 69 6e 20 74 68 65 20 42 74 53 68 61 72 65  s in the BtShare
04b0: 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c  d.pLock linked l
04c0: 69 73 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ist used to stor
04d0: 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61  e.  ** shared-ca
04e0: 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20  che table level 
04f0: 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69  locks. If the li
0500: 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65  brary is compile
0510: 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
0520: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
0530: 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74  ture disabled, t
0540: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  hen there is onl
0550: 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a  y ever one user.
0560: 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53    ** of each BtS
0570: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
0580: 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b  and so this lock
0590: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
05a0: 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64  sary. .  ** So d
05b0: 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72  efine the lock r
05c0: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73  elated functions
05d0: 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f   as no-ops..  */
05e0: 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65 72 79  .  #define query
05f0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
0600: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
0610: 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61  fine lockTable(a
0620: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
0630: 20 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b    #define unlock
0640: 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a 23 65 6c  AllTables(a).#el
0650: 73 65 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  se../*.** Query 
0660: 74 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20  to see if btree 
0670: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
0680: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
0690: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
06a0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
06b0: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
06c0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
06d0: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
06e0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
06f0: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
0700: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
0710: 6c 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29  ling lockTable()
0720: 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ), or.** SQLITE_
0730: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
0740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
0750: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  ryTableLock(Btre
0760: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
0770: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
0780: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
0790: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
07a0: 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69  pIter;..  /* Thi
07b0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
07c0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
07d0: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
07e0: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
07f0: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
0800: 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72  dOnly()->useShar
0810: 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  edData ){.    re
0820: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0830: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28    }..  /* This (
0840: 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54  along with lockT
0850: 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65  able()) is where
0860: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0870: 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a  tted flag is.  *
0880: 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66  * dealt with. If
0890: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71   the caller is q
08a0: 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65  uerying for a re
08b0: 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ad-lock and the 
08c0: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74  flag is.  ** set
08d0: 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74  , it is uncondit
08e0: 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20  ionally granted 
08f0: 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  - even if there 
0900: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
0910: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
0920: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
0930: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
0940: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0950: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
0960: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
0970: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
0980: 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c  unction lockTabl
0990: 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c  e(), if a read-l
09a0: 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20  ock is demanded 
09b0: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65  and the .  ** Re
09c0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
09d0: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e  ag is set, no en
09e0: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
09f0: 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a  the locks list .
0a00: 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70    ** (BtShared.p
0a10: 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Lock)..  **.  **
0a20: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49   To summarize: I
0a30: 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  f the ReadUncomm
0a40: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0a50: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72  t, then read cur
0a60: 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  sors do.  ** not
0a70: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
0a80: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
0a90: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63  The locking proc
0aa0: 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a  edure for a .  *
0ab0: 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64  * write-cursor d
0ac0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a  oes not change..
0ad0: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
0ae0: 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a  !p->pSqlite || .
0af0: 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69      0==(p->pSqli
0b00: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
0b10: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
0b20: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
0b30: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
0b40: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
0b50: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
0b60: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
0b70: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
0b80: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
0b90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
0ba0: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
0bb0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
0bc0: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
0bd0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
0be0: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
0bf0: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
0c00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0c10: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
0c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
0c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
0c50: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
0c60: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0c70: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
0c80: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
0c90: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
0ca0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
0cb0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
0cc0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
0cd0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
0ce0: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
0cf0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
0d00: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
0d10: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
0d20: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
0d30: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
0d40: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
0d50: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
0d60: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
0d70: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
0d80: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
0d90: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
0da0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
0db0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
0dc0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
0dd0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  ;..  /* This is 
0de0: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
0df0: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
0e00: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
0e10: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54 68  if( 0==sqlite3Th
0e20: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
0e30: 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ()->useSharedDat
0e40: 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
0e50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
0e60: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
0e70: 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c  _OK==queryTableL
0e80: 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65  ock(p, iTable, e
0e90: 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  Lock) );..  /* I
0ea0: 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  f the read-uncom
0eb0: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
0ec0: 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  et and a read-lo
0ed0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
0ee0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72  .  ** return ear
0ef0: 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e  ly without addin
0f00: 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  g an entry to th
0f10: 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b  e BtShared.pLock
0f20: 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20   list. See.  ** 
0f30: 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74  comment in funct
0f40: 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  ion queryTableLo
0f50: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e  ck() for more in
0f60: 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a  fo on handling .
0f70: 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63    ** the ReadUnc
0f80: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20  ommitted flag.. 
0f90: 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
0fa0: 70 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20 0a  p->pSqlite) && .
0fb0: 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d      (p->pSqlite-
0fc0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
0fd0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26  adUncommitted) &
0fe0: 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52  & .    (eLock==R
0ff0: 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20  EAD_LOCK) &&.   
1000: 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f   iTable!=MASTER_
1010: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65  ROOT.  ){.    re
1020: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1030: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
1040: 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  search the list 
1050: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
1060: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62  lock on this tab
1070: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  le. */.  for(pIt
1080: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1090: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
10a0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
10b0: 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  f( pIter->iTable
10c0: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65  ==iTable && pIte
10d0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  r->pBtree==p ){.
10e0: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49        pLock = pI
10f0: 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ter;.      break
1100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1110: 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73  * If the above s
1120: 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69  earch did not fi
1130: 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75  nd a BtLock stru
1140: 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42  ct associating B
1150: 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68  tree p.  ** with
1160: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61   table iTable, a
1170: 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20  llocate one and 
1180: 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
1190: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   list..  */.  if
11a0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
11b0: 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20  pLock = (BtLock 
11c0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  *)sqliteMalloc(s
11d0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
11e0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
11f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1210: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
1220: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
1230: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
1240: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
1250: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
1260: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
1270: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
1280: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
1290: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
12a0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
12b0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
12c0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
12d0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
12e0: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
12f0: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
1300: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
1310: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
1320: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
1330: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
1340: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
1350: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
1360: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
1370: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
1380: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
1390: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
13a0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
13b0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
13c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
13e0: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
13f0: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
1400: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
1410: 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28  o the lockTable(
1420: 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20  ).** procedure) 
1430: 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61  held by Btree ha
1440: 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69  ndle p..*/.stati
1450: 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c  c void unlockAll
1460: 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29  Tables(Btree *p)
1470: 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  {.  BtLock **ppI
1480: 74 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70  ter = &p->pBt->p
1490: 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Lock;..  /* If t
14a0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
14b0: 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74  extension is not
14c0: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20   enabled, there 
14d0: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a  should be no.  *
14e0: 2a 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 42  * locks in the B
14f0: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69  tShared.pLock li
1500: 73 74 2c 20 6d 61 6b 69 6e 67 20 74 68 69 73 20  st, making this 
1510: 70 72 6f 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f  procedure a no-o
1520: 70 2e 20 41 73 73 65 72 74 0a 20 20 2a 2a 20 74  p. Assert.  ** t
1530: 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20  hat this is the 
1540: 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  case..  */.  ass
1550: 65 72 74 28 20 73 71 6c 69 74 65 33 54 68 72 65  ert( sqlite3Thre
1560: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
1570: 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
1580: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1590: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
15a0: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
15b0: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
15c0: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  r;.    if( pLock
15d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
15e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
15f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
1600: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
1610: 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ock);.    }else{
1620: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
1630: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
1640: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1650: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1660: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1670: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
1680: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
1690: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
16a0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
16b0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
16c0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
16d0: 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  B./*.** Invalida
16e0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
16f0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1700: 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c  for cursor pCur,
1710: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
1720: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
1730: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1740: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1750: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
1760: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
1770: 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1780: 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w = 0;.}../*.** 
1790: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
17a0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
17b0: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
17c0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
17d0: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
17e0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
17f0: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
1800: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
1810: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
1820: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1830: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1840: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
1850: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1860: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
1870: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1880: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  p);.  }.}.#else.
1890: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
18a0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
18b0: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
18c0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
18d0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e  flowCache(x).#en
18e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  dif../*.** Save 
18f0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
1900: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
1910: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
1920: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
1930: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
1940: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
1950: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
1960: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1970: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1980: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
1990: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
19a0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
19b0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
19c0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
19d0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
19e0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
19f0: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1a00: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1a10: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
1a20: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1a30: 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   is an intKey ta
1a40: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62  ble, then the ab
1a50: 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  ove call to Btre
1a60: 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20  eKeySize().  ** 
1a70: 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67  stores the integ
1a80: 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e  er key in pCur->
1a90: 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61  nKey. In this ca
1aa0: 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  se this value is
1ab0: 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69  .  ** all that i
1ac0: 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  s required. Othe
1ad0: 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
1ae0: 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e  s not open on an
1af0: 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62   intKey.  ** tab
1b00: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
1b10: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
1b20: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
1b30: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
1b40: 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f  .  ** data..  */
1b50: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b60: 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d  E_OK && 0==pCur-
1b70: 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b  >pPage->intKey){
1b80: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
1b90: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70  = sqliteMalloc(p
1ba0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  Cur->nKey);.    
1bb0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
1bc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1bd0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1be0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
1bf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c10: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
1c20: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
1c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1c40: 6c 69 74 65 46 72 65 65 28 70 4b 65 79 29 3b 0a  liteFree(pKey);.
1c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1c60: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1c70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1c80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1c90: 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  !pCur->pPage->in
1ca0: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
1cb0: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
1cc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cd0: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ce0: 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
1cf0: 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30   pCur->pPage = 0
1d00: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1d10: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
1d20: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
1d30: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1d40: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
1d50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d60: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
1d70: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
1d80: 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45  ursors except pE
1d90: 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68  xcept open on th
1da0: 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68  e table .** with
1db0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
1dc0: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
1dd0: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
1de0: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
1df0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
1e00: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
1e10: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
1e20: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
1e30: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
1e40: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
1e50: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
1e60: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
1e70: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
1e80: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1e90: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
1ea0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1eb0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1ec0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
1ed0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
1ee0: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
1ef0: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
1f00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f10: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
1f20: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
1f30: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
1f40: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1f50: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1f60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1f80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f90: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
1fa0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
1fb0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
1fc0: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43  atic void clearC
1fd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
1fe0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ff0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
2000: 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  ->pKey);.  pCur-
2010: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75  >pKey = 0;.  pCu
2020: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2030: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  OR_INVALID;.}../
2040: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
2050: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
2060: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
2070: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
2080: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
2090: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
20a0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
20b0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
20c0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
20d0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
20e0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
20f0: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
2100: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
2110: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
2120: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
2130: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
2140: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2150: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
2160: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
2170: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2180: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
2190: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
21a0: 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65 6b  rgument - doSeek
21b0: 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65   - is false, the
21c0: 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a 2a  n instead of .**
21d0: 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 63   returning the c
21e0: 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73 61  ursor to it's sa
21f0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  ved position, an
2200: 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  y saved position
2210: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   is deleted.** a
2220: 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
2230: 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53 4f  ate set to CURSO
2240: 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 69 6e  R_INVALID..*/.in
2250: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  t sqlite3BtreeRe
2260: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2270: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
2280: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2290: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
22a0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22b0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
22c0: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
22d0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
22e0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49  .  if( pCur->isI
22f0: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 29 7b  ncrblobHandle ){
2300: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2310: 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
2320: 6e 64 69 66 0a 20 20 70 43 75 72 2d 3e 65 53 74  ndif.  pCur->eSt
2330: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2340: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ALID;.  rc = sql
2350: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
2360: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
2370: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
2380: 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20   &pCur->skip);. 
2390: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23a0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
23b0: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  Free(pCur->pKey)
23c0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
23d0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
23e0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2400: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2410: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
2420: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2430: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
2440: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2450: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
2460: 28 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  (p->eState==CURS
2470: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
2480: 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   \.         sqli
2490: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f  te3BtreeRestoreO
24a0: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
24b0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
24c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
24d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
24f0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
2500: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
2510: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
2520: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
2530: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2540: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
2550: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
2560: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
2570: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
2580: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
2590: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
25a0: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
25b0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
25c0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
25d0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
25e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
25f0: 35 29 2b 31 3b 0a 20 20 69 6e 74 20 69 50 74 72  5)+1;.  int iPtr
2600: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
2610: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
2620: 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 28 69 50  .  int ret = (iP
2630: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
2640: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
2650: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
2660: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2670: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
2680: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
2690: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
26a0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
26b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
26c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26d0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
26e0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
26f0: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
2700: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
2710: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
2720: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
2730: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
2740: 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72  pgno'..** An err
2750: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2760: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
2770: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
2780: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
2790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27a0: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
27b0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
27c0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
27d0: 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50  o parent){.  DbP
27e0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
27f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
2800: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
2810: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
2820: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
2830: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
2840: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
2850: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2860: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
2870: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
2880: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
2890: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
28a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
28b0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
28c0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
28d0: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
28e0: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
28f0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
2900: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
2910: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
2920: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2930: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
2940: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2950: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
2960: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
2970: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2980: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
2990: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
29a0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
29b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
29c0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
29d0: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
29e0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
29f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a10: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
2a20: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70  RMAP_PTROFFSET(p
2a30: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72  Bt, key);.  pPtr
2a40: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
2a50: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2a60: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
2a70: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
2a80: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
2a90: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
2aa0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
2ab0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
2ac0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
2ad0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
2ae0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
2af0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ));.    rc = sql
2b00: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b10: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2b20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b30: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
2b40: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
2b50: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2b60: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
2b70: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
2b80: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
2b90: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
2ba0: 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
2bb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
2bc0: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
2bd0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
2be0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2bf0: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
2c00: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
2c10: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
2c20: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
2c30: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
2c40: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
2c50: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
2c60: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
2c70: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
2c80: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
2c90: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
2ca0: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
2cb0: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
2cc0: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2cd0: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
2ce0: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
2cf0: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
2d00: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
2d10: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
2d20: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2d30: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
2d40: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
2d50: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
2d60: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
2d70: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
2d80: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
2d90: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
2da0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
2db0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
2dc0: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
2dd0: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
2de0: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
2df0: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
2e00: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
2e10: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
2e20: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
2e30: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
2e40: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
2e50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2e60: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
2e70: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
2e80: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
2e90: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
2ea0: 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c  P_PTROFFSET(pBt,
2eb0: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
2ec0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
2ed0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
2ee0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
2ef0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
2f00: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
2f10: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
2f20: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
2f30: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
2f40: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
2f50: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
2f60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2f70: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
2f80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2fa0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2fb0: 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  M */../*.** Give
2fc0: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
2fd0: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
2fe0: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
2ff0: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
3000: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
3010: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
3020: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
3030: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
3040: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
3050: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
3060: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
3070: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
3080: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
3090: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
30a0: 6c 73 2e 0a 2a 2f 0a 75 38 20 2a 73 71 6c 69 74  ls..*/.u8 *sqlit
30b0: 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28  e3BtreeFindCell(
30c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
30d0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
30e0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
30f0: 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28  aData;.  assert(
3100: 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61   iCell>=0 );.  a
3110: 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65 74  ssert( iCell<get
3120: 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
3130: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
3140: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 61 74   );.  return dat
3150: 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  a + get2byte(&da
3160: 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
3170: 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b 0a  fset+2*iCell]);.
3180: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  }../*.** This a 
3190: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
31a0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 42  sion of sqlite3B
31b0: 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20 74  treeFindCell() t
31c0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
31d0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
31e0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
31f0: 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65  cells.  See inse
3200: 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  rt.*/.static u8 
3210: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
3220: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
3230: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
3240: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
3250: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
3260: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3270: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
3280: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
3290: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
32a0: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
32b0: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
32c0: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
32d0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
32e0: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
32f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3300: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
3310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
3320: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
3330: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3340: 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70  3BtreeFindCell(p
3350: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
3360: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
3370: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
3380: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
3390: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
33a0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
33b0: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
33c0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
33d0: 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  n.  sqlite3Btree
33e0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
33f0: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
3400: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
3410: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71   argument and sq
3420: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3430: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
3440: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
3450: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
3460: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
3470: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
3480: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
3490: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
34a0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
34b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
34d0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
34e0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
34f0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3500: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
3510: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
3520: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
3530: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
3540: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cture */.){.  in
3550: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
3560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3570: 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f  bytes in cell co
3580: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a  ntent header */.
3590: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
35a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
35c0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
35d0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
35e0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
35f0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
3600: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
3610: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
3620: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
3630: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
3640: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
3650: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  ;.  if( pPage->h
3660: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 20  asData ){.    n 
3670: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
3680: 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c  pCell[n], &nPayl
3690: 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
36a0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
36b0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44  .  }.  pInfo->nD
36c0: 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  ata = nPayload;.
36d0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
36e0: 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  Key ){.    n += 
36f0: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
3700: 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26 70 49 6e  [n], (u64 *)&pIn
3710: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
3720: 73 65 7b 0a 20 20 20 20 75 33 32 20 78 3b 0a 20  se{.    u32 x;. 
3730: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
3740: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26  t32(&pCell[n], &
3750: 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  x);.    pInfo->n
3760: 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61  Key = x;.    nPa
3770: 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a  yload += x;.  }.
3780: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
3790: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
37a0: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
37b0: 20 6e 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   n;.  if( nPaylo
37c0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
37d0: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
37e0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
37f0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
3800: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
3810: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
3820: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
3830: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
3840: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
3850: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
3860: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
3870: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
3880: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
3890: 79 74 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66  ytes */.    pInf
38a0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79  o->nLocal = nPay
38b0: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
38c0: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
38d0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
38e0: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66  load + n;.    if
38f0: 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20  ( nSize<4 ){.   
3900: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20     nSize = 4;   
3910: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
3920: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
3930: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66  /.    }.    pInf
3940: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65  o->nSize = nSize
3950: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
3960: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
3970: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
3980: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
3990: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
39a0: 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65  ave.    ** to de
39b0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
39c0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
39d0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
39e0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a  pill onto.    **
39f0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
3a00: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
3a10: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
3a20: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
3a30: 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  ed.    ** space 
3a40: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
3a50: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
3a60: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
3a70: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20  cal storage.    
3a80: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
3a90: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
3aa0: 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cal..    **.    
3ab0: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
3ac0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
3ad0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
3ae0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
3af0: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20   any.    ** way 
3b00: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
3b10: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
3b20: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20  ile format..    
3b30: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  */.    int minLo
3b40: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
3b50: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
3b60: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
3b70: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f  */.    int maxLo
3b80: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
3b90: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
3ba0: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
3bb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c  */.    int surpl
3bc0: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
3bd0: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
3be0: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
3bf0: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69  orage */..    mi
3c00: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
3c10: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61  minLocal;.    ma
3c20: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
3c30: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75  maxLocal;.    su
3c40: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
3c50: 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
3c60: 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d  inLocal)%(pPage-
3c70: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
3c80: 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73   - 4);.    if( s
3c90: 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63  urplus <= maxLoc
3ca0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  al ){.      pInf
3cb0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70  o->nLocal = surp
3cc0: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
3cd0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
3ce0: 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  cal = minLocal;.
3cf0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
3d00: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e  >iOverflow = pIn
3d10: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a  fo->nLocal + n;.
3d20: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
3d30: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
3d40: 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 76  low + 4;.  }.}.v
3d50: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3d60: 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d  ParseCell(.  Mem
3d70: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
3d80: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
3d90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
3da0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c   */.  int iCell,
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dc0: 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e   The cell index.
3dd0: 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20    First cell is 
3de0: 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  0 */.  CellInfo 
3df0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
3e00: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
3e10: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
3e20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
3e30: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
3e40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e   sqlite3BtreeFin
3e50: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
3e60: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
3e70: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
3e80: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
3e90: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
3ea0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
3eb0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
3ec0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
3ed0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
3ee0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
3ef0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
3f00: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
3f10: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
3f20: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
3f30: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
3f40: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
3f50: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
3f60: 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ter..*/.#ifndef 
3f70: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
3f80: 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  t cellSize(MemPa
3f90: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
3fa0: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
3fb0: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
3fc0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
3fd0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69  pPage, iCell, &i
3fe0: 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nfo);.  return i
3ff0: 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e  nfo.nSize;.}.#en
4000: 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 63  dif.static int c
4010: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
4020: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
4030: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
4040: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
4050: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
4060: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
4070: 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72   &info);.  retur
4080: 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a  n info.nSize;.}.
4090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
40a0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
40b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
40c0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
40d0: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
40e0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
40f0: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
4100: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
4110: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
4120: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
4130: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
4140: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
4150: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
4160: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
4170: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
4180: 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a  .  if( pCell ){.
4190: 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
41a0: 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  o;.    sqlite3Bt
41b0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
41c0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
41d0: 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
41e0: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
41f0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
4200: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
4210: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  .nPayload );.   
4220: 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
4230: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
4240: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
4250: 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
4260: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
4270: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
4280: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
4290: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74  .      return pt
42a0: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
42b0: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
42c0: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
42d0: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
42e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
42f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
4300: 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  If the cell with
4310: 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20   index iCell on 
4320: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
4330: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
4340: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
4350: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
4360: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
4370: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
4380: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
4390: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
43a0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
43b0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
43c0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
43d0: 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 70 43 65 6c  8 *pCell;.  pCel
43e0: 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  l = findOverflow
43f0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
4400: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72  l);.  return ptr
4410: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
4420: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23  age, pCell);.}.#
4430: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
4440: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
4450: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
4460: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
4470: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
4480: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
4490: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
44a0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
44b0: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
44c0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
44d0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
44e0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
44f0: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
4500: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
4510: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
4520: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
4530: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
4540: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
4570: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
45a0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
45b0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
45d0: 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62  ffset of first b
45e0: 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70  yte after cell p
45f0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
4600: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4620: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
4630: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
4640: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
4650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4660: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
4670: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
4680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4690: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
46a0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
46b0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
46c0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
46d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
46e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
46f0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ray */.  int brk
4700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4710: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
4720: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
4730: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
4740: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
4750: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4760: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
4770: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
4780: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
4790: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
47a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
47b0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
47c0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
47d0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
47e0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
47f0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
4800: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
4810: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
4820: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
4830: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
4840: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
4850: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
4860: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
4870: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
4880: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
4890: 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  =0 );.  temp = s
48a0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
48b0: 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
48c0: 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70 3d  e );.  if( temp=
48d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
48e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74 61  TE_NOMEM;.  data
48f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
4900: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
4910: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
4920: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
4930: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
4940: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
4950: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
4960: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
4970: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
4980: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
4990: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
49a0: 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20 67  eSize;.  brk = g
49b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
49c0: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
49d0: 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61 74  &temp[brk], &dat
49e0: 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
49f0: 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72 6b  ze - brk);.  brk
4a00: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
4a10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
4a20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
4a30: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
4a40: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
4a50: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
4a60: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
4a70: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
4a80: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
4a90: 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Addr);.    asser
4aa0: 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74  t( pc<pPage->pBt
4ab0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
4ac0: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
4ad0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
4ae0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62 72  emp[pc]);.    br
4af0: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d  k -= size;.    m
4b00: 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b 5d  emcpy(&data[brk]
4b10: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
4b20: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
4b30: 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20 20  (pAddr, brk);.  
4b40: 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b 3e  }.  assert( brk>
4b50: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
4b60: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
4b70: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
4b80: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
4b90: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
4ba0: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
4bb0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
4bc0: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
4bd0: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
4be0: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
4bf0: 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b 0a  , 0, brk-addr);.
4c00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65 6d    sqliteFree(tem
4c10: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
4c20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4c30: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
4c40: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f  bytes of space o
4c50: 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  n a page..**.** 
4c60: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
4c70: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
4c80: 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73  ta[] of the firs
4c90: 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65  t byte of.** the
4ca0: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
4cb0: 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66 20   Or return 0 if 
4cc0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f  there is not eno
4cd0: 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61 63  ugh free.** spac
4ce0: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  e on the page to
4cf0: 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c 6c   satisfy the all
4d00: 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74 2e  ocation request.
4d10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
4d20: 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74  ge contains nByt
4d30: 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  es of free space
4d40: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f   but does not co
4d50: 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20  ntain.** nBytes 
4d60: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66 72  of contiguous fr
4d70: 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20 74  ee space, then t
4d80: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74 6f  his routine auto
4d90: 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c  matically.** cal
4da0: 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50 61  ls defragementPa
4db0: 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64  ge() to consolid
4dc0: 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70 61  ate all free spa
4dd0: 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c  ce before .** al
4de0: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65 77  locating the new
4df0: 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69   chunk..*/.stati
4e00: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
4e10: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
4e20: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  ge, int nByte){.
4e30: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c 20    int addr, pc, 
4e40: 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  hdr;.  int size;
4e50: 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20  .  int nFrag;.  
4e60: 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e  int top;.  int n
4e70: 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c  Cell;.  int cell
4e80: 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e  Offset;.  unsign
4e90: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
4ea0: 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65   .  data = pPage
4eb0: 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72  ->aData;.  asser
4ec0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
4ed0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
4ee0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
4ef0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
4f00: 42 74 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  Bt );.  if( nByt
4f10: 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b  e<4 ) nByte = 4;
4f20: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46  .  if( pPage->nF
4f30: 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61  ree<nByte || pPa
4f40: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
4f50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50  ) return 0;.  pP
4f60: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42  age->nFree -= nB
4f70: 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  yte;.  hdr = pPa
4f80: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a  ge->hdrOffset;..
4f90: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
4fa0: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
4fb0: 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ag<60 ){.    /* 
4fc0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
4fd0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
4fe0: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
4ff0: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
5000: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65  .    ** space re
5010: 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64  quest. */.    ad
5020: 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20  dr = hdr+1;.    
5030: 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74  while( (pc = get
5040: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5050: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ]))>0 ){.      s
5060: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
5070: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
5080: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
5090: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
50a0: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
50b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
50c0: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
50d0: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
50e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
50f0: 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73  r+7] = nFrag + s
5100: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5110: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5120: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5130: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
5140: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
5150: 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20   size-nByte);.  
5160: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
5170: 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  c + size - nByte
5180: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5190: 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
51a0: 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   pc;.    }.  }..
51b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
51c0: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
51d0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
51e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
51f0: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
5200: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
5210: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
5220: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5230: 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c  hdr+5]);.  nCell
5240: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5250: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c  a[hdr+3]);.  cel
5260: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5270: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69  >cellOffset;.  i
5280: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20  f( nFrag>=60 || 
5290: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
52a0: 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79  Cell > top - nBy
52b0: 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  te ){.    if( de
52c0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
52d0: 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ge) ) return 0;.
52e0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
52f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5300: 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e  ;.  }.  top -= n
5310: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
5320: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5330: 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  Cell <= top );. 
5340: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5350: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
5360: 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f  return top;.}../
5370: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65  *.** Return a se
5380: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61  ction of the pPa
5390: 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65  ge->aData to the
53a0: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68   freelist..** Th
53b0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
53c0: 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f  the new free blo
53d0: 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69  ck is pPage->aDi
53e0: 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  sk[start].** and
53f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5400: 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22   block is "size"
5410: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f   bytes..**.** Mo
5420: 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74  st of the effort
5430: 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65   here is involve
5440: 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61  d in coalesing a
5450: 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20  djacent.** free 
5460: 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69  blocks into a si
5470: 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c  ngle big free bl
5480: 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ock..*/.static v
5490: 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65  oid freeSpace(Me
54a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
54b0: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
54c0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
54d0: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75  pbegin, hdr;.  u
54e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
54f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
5500: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  a;..  assert( pP
5510: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
5520: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5530: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5540: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5550: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
5560: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
5570: 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
5580: 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61  leaf?0:4) );.  a
5590: 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20  ssert( (start + 
55a0: 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42  size)<=pPage->pB
55b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
55c0: 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20  .  if( size<4 ) 
55d0: 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64 65  size = 4;..#ifde
55e0: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
55f0: 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72  DELETE.  /* Over
5600: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
5610: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
5620: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45  eros when the SE
5630: 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a  CURE_DELETE .  *
5640: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
5650: 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
5660: 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ime */.  memset(
5670: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c  &data[start], 0,
5680: 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a   size);.#endif..
5690: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
56a0: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
56b0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
56c0: 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  freeblocks */.  
56d0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
56e0: 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d  Offset;.  addr =
56f0: 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c   hdr + 1;.  whil
5700: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
5710: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5720: 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65  ]))<start && pbe
5730: 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  gin>0 ){.    ass
5740: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
5750: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
5760: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73  ize-4 );.    ass
5770: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
5780: 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   );.    addr = p
5790: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begin;.  }.  ass
57a0: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
57b0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
57c0: 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72  ize-4 );.  asser
57d0: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
57e0: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
57f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5800: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
5810: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5820: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
5830: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
5840: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
5850: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
5860: 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a  e += size;..  /*
5870: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
5880: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
5890: 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65  /.  addr = pPage
58a0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b  ->hdrOffset + 1;
58b0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
58c0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
58d0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
58e0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
58f0: 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  size;.    assert
5900: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
5910: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
5920: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
5930: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
5940: 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74  .    pnext = get
5950: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
5960: 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20  in]);.    psize 
5970: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5980: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
5990: 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73   if( pbegin + ps
59a0: 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74  ize + 3 >= pnext
59b0: 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20   && pnext>0 ){. 
59c0: 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20       int frag = 
59d0: 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b  pnext - (pbegin+
59e0: 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73  psize);.      as
59f0: 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61  sert( frag<=data
5a00: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
5a10: 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61  t+7] );.      da
5a20: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
5a30: 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a  set+7] -= frag;.
5a40: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
5a50: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65  data[pbegin], ge
5a60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
5a70: 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74  xt]));.      put
5a80: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
5a90: 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74  in+2], pnext+get
5aa0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
5ab0: 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20  t+2])-pbegin);. 
5ac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5ad0: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
5ae0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
5af0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
5b00: 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77  nt area begins w
5b10: 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c  ith a freeblock,
5b20: 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   remove it. */. 
5b30: 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d   if( data[hdr+1]
5b40: 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26  ==data[hdr+5] &&
5b50: 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61   data[hdr+2]==da
5b60: 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20  ta[hdr+6] ){.   
5b70: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62   int top;.    pb
5b80: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
5b90: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
5ba0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
5bb0: 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62  hdr+1], &data[pb
5bc0: 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74  egin], 2);.    t
5bd0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
5be0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
5bf0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5c00: 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65  hdr+5], top + ge
5c10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
5c20: 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a  gin+2]));.  }.}.
5c30: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
5c40: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
5c50: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
5c60: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
5c70: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
5c80: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
5c90: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
5ca0: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
5cb0: 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ngly..*/.static 
5cc0: 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61 67 73  void decodeFlags
5cd0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
5ce0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
5cf0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
5d00: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
5d10: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
5d20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5d30: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
5d40: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
5d50: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 70 50 61  00 : 0) );.  pPa
5d60: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66 6c  ge->intKey = (fl
5d70: 61 67 42 79 74 65 20 26 20 28 50 54 46 5f 49 4e  agByte & (PTF_IN
5d80: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
5d90: 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  A))!=0;.  pPage-
5da0: 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c 61  >zeroData = (fla
5db0: 67 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52 4f  gByte & PTF_ZERO
5dc0: 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
5dd0: 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67 42  e->leaf = (flagB
5de0: 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29 21  yte & PTF_LEAF)!
5df0: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  =0;.  pPage->chi
5e00: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28 70  ldPtrSize = 4*(p
5e10: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a  Page->leaf==0);.
5e20: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
5e30: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
5e40: 74 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54  te & PTF_LEAFDAT
5e50: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
5e60: 6c 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20 20  leafData = 1;.  
5e70: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
5e80: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
5e90: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
5ea0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
5eb0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Leaf;.  }else{. 
5ec0: 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
5ed0: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ta = 0;.    pPag
5ee0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
5ef0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
5f00: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
5f10: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
5f20: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 68  ;.  }.  pPage->h
5f30: 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65  asData = !(pPage
5f40: 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21  ->zeroData || (!
5f50: 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70  pPage->leaf && p
5f60: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29  Page->leafData))
5f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
5f80: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
5f90: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
5fa0: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
5fb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
5fc0: 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ent parameter mu
5fd0: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
5fe0: 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 77  to the MemPage w
5ff0: 68 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20 70  hich.** is the p
6000: 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  arent of the pag
6010: 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69  e being initiali
6020: 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f  zed.  The root o
6030: 66 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61 73  f a.** BTree has
6040: 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20 73   no parent and s
6050: 6f 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2c  o for that page,
6060: 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a   pParent==NULL..
6070: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
6080: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
6090: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
60a0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
60b0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
60c0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
60d0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
60e0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
60f0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
6100: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
6110: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
6120: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
6130: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
6140: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
6150: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
6160: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
6170: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
6180: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
6190: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
61a0: 49 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50  InitPage(.  MemP
61b0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
61c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
61d0: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
61e0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
61f0: 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  Parent       /* 
6200: 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67  The parent.  Mig
6210: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
6220: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
6230: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
6240: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
6250: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
6260: 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68  ata[] */.  int h
6270: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
6280: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
6290: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
62a0: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
62b0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
62c0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
62d0: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
62e0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
62f0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
6300: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
6310: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
6320: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
6330: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
6340: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
6350: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
6360: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
6370: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
6380: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
6390: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
63a0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
63b0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
63c0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
63d0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
63e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
63f0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
6400: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
6410: 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  ea */..  pBt = p
6420: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73  Page->pBt;.  ass
6430: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
6440: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
6450: 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
6460: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73  pBt==pBt );.  as
6470: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
6480: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
6490: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
64a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
64b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
64c0: 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e  ata == &((unsign
64d0: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b  ed char*)pPage)[
64e0: 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  -pBt->pageSize] 
64f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
6500: 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74  pParent!=pParent
6510: 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72   && (pPage->pPar
6520: 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d  ent!=0 || pPage-
6530: 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20  >isInit) ){.    
6540: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61  /* The parent pa
6550: 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
6560: 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68  change unless th
6570: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
6580: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
6590: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
65a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
65b0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72  Page->isInit ) r
65c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65d0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
65e0: 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  arent==0 && pPar
65f0: 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50  ent!=0 ){.    pP
6600: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  age->pParent = p
6610: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
6620: 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
6630: 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
6640: 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65   }.  hdr = pPage
6650: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64  ->hdrOffset;.  d
6660: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
6670: 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  ta;.  decodeFlag
6680: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
6690: 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  r]);.  pPage->nO
66a0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70  verflow = 0;.  p
66b0: 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
66c0: 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   0;.  usableSize
66d0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
66e0: 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  ze;.  pPage->cel
66f0: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
6700: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
6710: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
6720: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
6730: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
6740: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
6750: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6760: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
6770: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
6780: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
6790: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
67a0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
67b0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
67c0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
67d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
67e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
67f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
6800: 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  e->nCell==0 && p
6810: 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61  Parent!=0 && pPa
6820: 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  rent->pgno!=1 ){
6830: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65  .    /* All page
6840: 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c  s must have at l
6850: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65  east one cell, e
6860: 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70  xcept for root p
6870: 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ages */.    retu
6880: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6890: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
68a0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
68b0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
68c0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
68d0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
68e0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e  ata[hdr+1]);.  n
68f0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
6900: 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c  7] + top - (cell
6910: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
6920: 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c  ->nCell);.  whil
6930: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69  e( pc>0 ){.    i
6940: 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  nt next, size;. 
6950: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
6960: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
6970: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
6980: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
6990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
69a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
69b0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65  T; .    }.    ne
69c0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
69d0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69  ata[pc]);.    si
69e0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
69f0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
6a00: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
6a10: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
6a20: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
6a30: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
6a40: 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
6a50: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
6a60: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6a70: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
6a80: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
6a90: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
6aa0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
6ab0: 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28  e = nFree;.  if(
6ac0: 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69   nFree>=usableSi
6ad0: 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65  ze ){.    /* Fre
6ae0: 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65  e space cannot e
6af0: 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65  xceed total page
6b00: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74   size */.    ret
6b10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6b20: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
6b30: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
6b40: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
6b50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6b60: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
6b70: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
6b80: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
6b90: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
6ba0: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
6bb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
6bc0: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
6bd0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
6be0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
6bf0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
6c00: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
6c10: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
6c20: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64  e->pBt;.  int hd
6c30: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
6c40: 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73  fset;.  int firs
6c50: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
6c60: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
6c70: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
6c80: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
6c90: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  o );.  assert( &
6ca0: 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  data[pBt->pageSi
6cb0: 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64  ze] == (unsigned
6cc0: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
6cd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6ce0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6cf0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6d00: 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ) );.  memset(&d
6d10: 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
6d20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
6d30: 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d  dr);.  data[hdr]
6d40: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73   = flags;.  firs
6d50: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
6d60: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
6d70: 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  )==0);.  memset(
6d80: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
6d90: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
6da0: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
6db0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
6dc0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
6dd0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
6de0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
6df0: 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64  ize - first;.  d
6e00: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
6e10: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
6e20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
6e30: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
6e40: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
6e50: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
6e60: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
6e70: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
6e80: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
6e90: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
6ea0: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  nit = 1;.}../*.*
6eb0: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
6ec0: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
6ed0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
6ee0: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
6ef0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
6f00: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
6f10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
6f20: 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73  oContent flag is
6f30: 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
6f40: 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
6f50: 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
6f60: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
6f70: 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
6f80: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
6f90: 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
6fa0: 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
6fb0: 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
6fc0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
6fd0: 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
6fe0: 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
6ff0: 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
7000: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
7010: 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
7020: 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
7030: 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
7040: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
7050: 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
7060: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
7070: 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
7080: 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
7090: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
70a0: 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
70b0: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
70c0: 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
70d0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
70e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
70f0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
7100: 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
7110: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
7120: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
7130: 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
7140: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  meter */.  int n
7150: 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20  oContent        
7160: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70  /* Do not load p
7170: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74  age content if t
7180: 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
7190: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
71a0: 50 61 67 65 3b 0a 20 20 44 62 50 61 67 65 20 2a  Page;.  DbPage *
71b0: 70 44 62 50 61 67 65 3b 0a 0a 20 20 72 63 20 3d  pDbPage;..  rc =
71c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
71d0: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
71e0: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
71f0: 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f  *)&pDbPage, noCo
7200: 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ntent);.  if( rc
7210: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7220: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
7230: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
7240: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
7250: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
7260: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
7270: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
7280: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
7290: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
72a0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
72b0: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
72c0: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
72d0: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
72e0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
72f0: 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20   : 0;.  *ppPage 
7300: 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = pPage;.  retur
7310: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7320: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
7330: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
7340: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
7350: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
7360: 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f  .** is just a co
7370: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
7380: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
7390: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  e calls to.** sq
73a0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
73b0: 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42  e() and sqlite3B
73c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
73d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
73e0: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
73f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
7400: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
7410: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7420: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
7430: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7440: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
7450: 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
7460: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
7470: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
7480: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
7490: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
74a0: 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  nt     /* Parent
74b0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
74c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
74d0: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
74e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
74f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
7500: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
7510: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
7520: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
7530: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
7540: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
7550: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
7560: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7570: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
7580: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
7590: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
75a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
75b0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
75c0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
75d0: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
75e0: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
75f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
7600: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
7610: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7620: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
7630: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
7640: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
7650: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
7660: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7670: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
7680: 20 20 61 73 73 65 72 74 28 20 26 70 50 61 67 65    assert( &pPage
7690: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70  ->aData[pPage->p
76a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d 28  Bt->pageSize]==(
76b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
76c0: 50 61 67 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  Page );.    sqli
76d0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
76e0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
76f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
7700: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7710: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
7720: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
7730: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
7740: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
7750: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
7760: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
7770: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
7780: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
7790: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
77a0: 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  r(DbPage *pData,
77b0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
77c0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
77d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
77e0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
77f0: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
7800: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
7810: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
7820: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
7830: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d  pParent ){.    M
7840: 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20  emPage *pParent 
7850: 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
7860: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61  ;.    pPage->pPa
7870: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  rent = 0;.    re
7880: 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
7890: 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  t);.  }.  pPage-
78a0: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a  >isInit = 0;.}..
78b0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
78c0: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
78d0: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
78e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
78f0: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
7900: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
7910: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
7920: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
7930: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
7940: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
7950: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
7960: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
7970: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7980: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
7990: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
79a0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
79b0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
79c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
79d0: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
79e0: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
79f0: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
7a00: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
7a10: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
7a20: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
7a30: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
7a40: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
7a50: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
7a60: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
7a70: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
7a80: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
7a90: 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  a);.  if( pPage-
7aa0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 70  >isInit ){.    p
7ab0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
7ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
7ad0: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
7ae0: 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
7af0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7b00: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
7b10: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
7b20: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
7b30: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7b40: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
7b50: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
7b60: 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  * a new database
7b70: 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e   with a random n
7b80: 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ame is created. 
7b90: 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e   This randomly n
7ba0: 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  amed.** database
7bb0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
7bc0: 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74  leted when sqlit
7bd0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
7be0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74  s called..*/.int
7bf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
7c00: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
7c10: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
7c20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
7c30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7c40: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
7c50: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53 71  /.  sqlite3 *pSq
7c60: 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 41  lite,       /* A
7c70: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
7c80: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
7c90: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
7ca0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7cb0: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
7cc0: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
7cd0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
7ce0: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
7cf0: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b  /* Options */.){
7d00: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
7d10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
7d20: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
7d30: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
7d40: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
7d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
7d60: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
7d70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7d80: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65  TE_OK;.  int nRe
7d90: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
7da0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
7db0: 5b 31 30 30 5d 3b 0a 23 69 66 20 21 64 65 66 69  [100];.#if !defi
7dc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7dd0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
7de0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7df0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
7e00: 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61  const ThreadData
7e10: 20 2a 70 54 73 64 72 6f 3b 0a 23 65 6e 64 69 66   *pTsdro;.#endif
7e20: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
7e30: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
7e40: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
7e50: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
7e60: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
7e70: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
7e80: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
7e90: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
7ea0: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
7eb0: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
7ec0: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
7ed0: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
7ee0: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
7ef0: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
7f00: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
7f10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7f20: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
7f30: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
7f40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7f50: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
7f60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
7f70: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
7f80: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
7f90: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
7fa0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
7fb0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
7fc0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
7fd0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
7fe0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
7ff0: 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   p = sqliteMallo
8000: 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  c(sizeof(Btree))
8010: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
8020: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8030: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
8040: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
8050: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69  NONE;.  p->pSqli
8060: 74 65 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 20  te = pSqlite;.. 
8070: 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
8080: 61 6e 20 65 78 69 73 74 69 6e 67 20 42 74 72 65  an existing Btre
8090: 65 20 73 74 72 75 63 74 75 72 65 20 6f 70 65 6e  e structure open
80a0: 65 64 20 6f 6e 20 7a 46 69 6c 65 6e 61 6d 65 2e  ed on zFilename.
80b0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
80c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
80d0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
80e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
80f0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 70 54 73  IT_DISKIO).  pTs
8100: 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
8110: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
8120: 29 3b 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d  );.  if( pTsdro-
8130: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 26  >useSharedData &
8140: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  & zFilename && !
8150: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 63  isMemdb ){.    c
8160: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
8170: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
8180: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
8190: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  name);.    if( !
81a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
81b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
81c0: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
81d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
81e0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
81f0: 42 74 3d 70 54 73 64 72 6f 2d 3e 70 42 74 72 65  Bt=pTsdro->pBtre
8200: 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  e; pBt; pBt=pBt-
8210: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
8220: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
8230: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
8240: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
8250: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
8260: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
8270: 74 2d 3e 70 50 61 67 65 72 29 29 20 29 7b 0a 20  t->pPager)) ){. 
8280: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
8290: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  pBt;.        *pp
82a0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  Btree = p;.     
82b0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
82c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
82d0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
82e0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
82f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
8300: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8310: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
8320: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  athname);.  }.#e
8330: 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
8340: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
8350: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
8360: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
8370: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
8380: 65 20 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 72  e are.  ** the r
8390: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
83a0: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
83b0: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
83c0: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
83d0: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
83e0: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
83f0: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
8400: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69   */.  assert( si
8410: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
8420: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
8430: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
8440: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
8450: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
8460: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
8470: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (u32)==4 );.  as
8480: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
8490: 29 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  )==2 );.  assert
84a0: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
84b0: 34 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 73 71  4 );..  pBt = sq
84c0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
84d0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 69 66  of(*pBt) );.  if
84e0: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
84f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8500: 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 74 72 65  M;.    goto btre
8510: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a  e_open_out;.  }.
8520: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
8530: 67 65 72 4f 70 65 6e 28 26 70 42 74 2d 3e 70 50  gerOpen(&pBt->pP
8540: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
8550: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
8560: 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  gs);.  if( rc==S
8570: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8580: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8590: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
85a0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
85b0: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
85c0: 62 48 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20  bHeader);.  }.  
85d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
85e0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 74  K ){.    goto bt
85f0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
8600: 7d 0a 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74  }.  p->pBt = pBt
8610: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
8620: 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70  rSetDestructor(p
8630: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
8640: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 73  Destructor);.  s
8650: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
8660: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
8670: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
8680: 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
8690: 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  = 0;.  pBt->pPag
86a0: 65 31 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 72  e1 = 0;.  pBt->r
86b0: 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65  eadOnly = sqlite
86c0: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
86d0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
86e0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
86f0: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
8700: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69 66 28  ader[16]);.  if(
8710: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
8720: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
8730: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
8740: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
8750: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
8760: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
8770: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ize)!=0 ){.    p
8780: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  Bt->pageSize = S
8790: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
87a0: 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70 42 74  GE_SIZE;.    pBt
87b0: 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d  ->maxEmbedFrac =
87c0: 20 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f   64;   /* 25% */
87d0: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62  .    pBt->minEmb
87e0: 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f  edFrac = 32;   /
87f0: 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 70  * 12.5% */.    p
8800: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20  Bt->minLeafFrac 
8810: 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e 35  = 32;    /* 12.5
8820: 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  % */.#ifndef SQL
8830: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8840: 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
8850: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
8860: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
8870: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
8880: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
8890: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
88a0: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
88b0: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
88c0: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
88d0: 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
88e0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
88f0: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
8900: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
8910: 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
8920: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8930: 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
8940: 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
8950: 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
8960: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
8970: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
8980: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
8990: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
89a0: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 2a 2f  r normal..    */
89b0: 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
89c0: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
89d0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  {.      pBt->aut
89e0: 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
89f0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
8a00: 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
8a10: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
8a20: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
8a30: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
8a40: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
8a50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
8a60: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
8a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65  }else{.    nRese
8a80: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
8a90: 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  20];.    pBt->ma
8aa0: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62  xEmbedFrac = zDb
8ab0: 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20  Header[21];.    
8ac0: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
8ad0: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32  c = zDbHeader[22
8ae0: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
8af0: 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61  eafFrac = zDbHea
8b00: 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74  der[23];.    pBt
8b10: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
8b20: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
8b30: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8b40: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
8b50: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
8b60: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
8b70: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
8b80: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74  #endif.  }.  pBt
8b90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
8ba0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
8bb0: 52 65 73 65 72 76 65 3b 0a 20 20 61 73 73 65 72  Reserve;.  asser
8bc0: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
8bd0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
8be0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
8bf0: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
8c00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
8c10: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
8c20: 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 70 61 67  pPager, pBt->pag
8c30: 65 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21 64 65  eSize);..#if !de
8c40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8c50: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
8c60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
8c70: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
8c80: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
8c90: 20 62 74 72 65 65 20 74 6f 20 74 68 65 20 6c 69   btree to the li
8ca0: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
8cb0: 6e 67 20 61 74 20 54 68 72 65 61 64 44 61 74 61  ng at ThreadData
8cc0: 2e 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68  .pBtree..  ** Th
8cd0: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
8ce0: 20 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29   that a malloc()
8cf0: 20 6d 61 79 20 66 61 69 6c 20 69 6e 73 69 64 65   may fail inside
8d00: 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 71   of the .  ** sq
8d10: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
8d20: 29 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 54  ) call, as the T
8d30: 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74  hreadData struct
8d40: 75 72 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ure must have al
8d50: 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
8d60: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 70 54  allocated for pT
8d70: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
8d80: 61 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65  ata to be non-ze
8d90: 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ro..  */.  if( p
8da0: 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64  Tsdro->useShared
8db0: 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d  Data && zFilenam
8dc0: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
8dd0: 0a 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20  .    pBt->pNext 
8de0: 3d 20 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65  = pTsdro->pBtree
8df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72  ;.    sqlite3Thr
8e00: 65 61 64 44 61 74 61 28 29 2d 3e 70 42 74 72 65  eadData()->pBtre
8e10: 65 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e  e = pBt;.  }.#en
8e20: 64 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20  dif.  pBt->nRef 
8e30: 3d 20 31 3b 0a 20 20 2a 70 70 42 74 72 65 65 20  = 1;.  *ppBtree 
8e40: 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
8e50: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
8e60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8e70: 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
8e80: 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
8e90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
8ea0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
8eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8ec0: 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  eFree(pBt);.    
8ed0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20  sqliteFree(p);. 
8ee0: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
8ef0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8f10: 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
8f20: 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
8f30: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
8f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
8f50: 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
8f60: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
8f70: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
8f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 23  Cursor *pCur;..#
8f90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8fa0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
8fb0: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
8fc0: 73 64 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  sd;.#endif..  /*
8fd0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
8fe0: 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
8ff0: 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
9000: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
9010: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
9020: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
9030: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
9040: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
9050: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
9060: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
9070: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
9080: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
9090: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
90a0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
90b0: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
90c0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
90d0: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
90e0: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
90f0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
9100: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
9110: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
9120: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
9130: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
9140: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
9150: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
9160: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
9170: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
9180: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
9190: 43 48 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  CHE.  /* If ther
91a0: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
91b0: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
91c0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
91d0: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
91e0: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
91f0: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
9200: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
9210: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
9220: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
9230: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
9240: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
9250: 52 65 66 3e 30 20 29 3b 0a 20 20 70 42 74 2d 3e  Ref>0 );.  pBt->
9260: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
9270: 74 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 72  t->nRef ){.    r
9280: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9290: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
92a0: 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  e the shared-btr
92b0: 65 65 20 66 72 6f 6d 20 74 68 65 20 74 68 72 65  ee from the thre
92c0: 61 64 20 77 69 64 65 20 6c 69 73 74 2e 20 43 61  ad wide list. Ca
92d0: 6c 6c 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44  ll .  ** ThreadD
92e0: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 20 61 6e  ataReadOnly() an
92f0: 64 20 74 68 65 6e 20 63 61 73 74 20 61 77 61 79  d then cast away
9300: 20 74 68 65 20 63 6f 6e 73 74 20 70 72 6f 70 65   the const prope
9310: 72 74 79 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  rty of the .  **
9320: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69   pointer to avoi
9330: 64 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 72  d allocating thr
9340: 65 61 64 20 64 61 74 61 20 69 66 20 69 74 20 69  ead data if it i
9350: 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 72 65 71  s not really req
9360: 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54  uired..  */.  pT
9370: 73 64 20 3d 20 28 54 68 72 65 61 64 44 61 74 61  sd = (ThreadData
9380: 20 2a 29 73 71 6c 69 74 65 33 54 68 72 65 61 64   *)sqlite3Thread
9390: 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  DataReadOnly();.
93a0: 20 20 69 66 28 20 70 54 73 64 2d 3e 70 42 74 72    if( pTsd->pBtr
93b0: 65 65 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 61  ee==pBt ){.    a
93c0: 73 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c  ssert( pTsd==sql
93d0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
93e0: 20 29 3b 0a 20 20 20 20 70 54 73 64 2d 3e 70 42   );.    pTsd->pB
93f0: 74 72 65 65 20 3d 20 70 42 74 2d 3e 70 4e 65 78  tree = pBt->pNex
9400: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
9410: 42 74 53 68 61 72 65 64 20 2a 70 50 72 65 76 3b  BtShared *pPrev;
9420: 0a 20 20 20 20 66 6f 72 28 70 50 72 65 76 3d 70  .    for(pPrev=p
9430: 54 73 64 2d 3e 70 42 74 72 65 65 3b 20 70 50 72  Tsd->pBtree; pPr
9440: 65 76 20 26 26 20 70 50 72 65 76 2d 3e 70 4e 65  ev && pPrev->pNe
9450: 78 74 21 3d 70 42 74 3b 20 70 50 72 65 76 3d 70  xt!=pBt; pPrev=p
9460: 50 72 65 76 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  Prev->pNext){}. 
9470: 20 20 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a     if( pPrev ){.
9480: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
9490: 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61  sd==sqlite3Threa
94a0: 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 20  dData() );.     
94b0: 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
94c0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
94d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
94e0: 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 70 61 67  /* Close the pag
94f0: 65 72 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  er and free the 
9500: 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
9510: 75 63 74 75 72 65 20 2a 2f 0a 20 20 61 73 73 65  ucture */.  asse
9520: 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
9530: 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  r );.  sqlite3Pa
9540: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
9550: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 42 74  ager);.  if( pBt
9560: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
9570: 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
9580: 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53  .    pBt->xFreeS
9590: 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
95a0: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
95b0: 65 46 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  eFree(pBt->pSche
95c0: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ma);.  sqliteFre
95d0: 65 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  e(pBt);.  return
95e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
95f0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
9600: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c  busy handler cal
9610: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
9620: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
9630: 72 65 65 53 65 74 42 75 73 79 48 61 6e 64 6c 65  reeSetBusyHandle
9640: 72 28 42 74 72 65 65 20 2a 70 2c 20 42 75 73 79  r(Btree *p, Busy
9650: 48 61 6e 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65  Handler *pHandle
9660: 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  r){.  BtShared *
9670: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
9680: 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  pBt->pBusyHandle
9690: 72 20 3d 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20  r = pHandler;.  
96a0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
96b0: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
96c0: 70 50 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72  pPager, pHandler
96d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
96e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
96f0: 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
9700: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
9710: 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
9720: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
9730: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
9740: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
9750: 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
9760: 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
9770: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
9780: 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
9790: 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
97a0: 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
97b0: 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
97c0: 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
97d0: 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
97e0: 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
97f0: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
9800: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
9810: 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
9820: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
9830: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
9840: 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
9850: 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
9860: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
9870: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
9880: 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
9890: 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
98a0: 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
98b0: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
98c0: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
98d0: 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
98e0: 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
98f0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
9900: 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
9910: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
9920: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
9930: 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
9940: 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
9950: 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
9960: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
9970: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
9980: 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
9990: 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
99a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
99b0: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
99c0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
99d0: 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
99e0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
99f0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
9a00: 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
9a10: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
9a20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
9a30: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9a40: 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
9a50: 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
9a60: 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
9a70: 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
9a80: 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
9a90: 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
9aa0: 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
9ab0: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
9ac0: 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
9ad0: 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
9ae0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
9af0: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
9b00: 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
9b10: 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
9b20: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
9b30: 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
9b40: 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
9b50: 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
9b60: 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
9b70: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
9b80: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
9b90: 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
9ba0: 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
9bb0: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
9bc0: 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
9bd0: 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
9be0: 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
9bf0: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
9c00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
9c10: 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
9c20: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
9c30: 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
9c40: 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
9c50: 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
9c60: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
9c70: 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
9c80: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
9c90: 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
9ca0: 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
9cb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
9cc0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
9cd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
9ce0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
9cf0: 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
9d00: 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
9d10: 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
9d20: 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
9d30: 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
9d40: 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
9d50: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
9d60: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
9d70: 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
9d80: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
9d90: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
9da0: 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
9db0: 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 65  ->pPager );.  re
9dc0: 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
9dd0: 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
9de0: 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  ger);.}..#if !de
9df0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9e00: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
9e10: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
9e20: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
9e30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
9e40: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
9e50: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
9e60: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
9e70: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
9e80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
9e90: 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
9ea0: 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
9eb0: 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
9ec0: 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
9ed0: 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
9ee0: 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
9ef0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
9f00: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
9f10: 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
9f20: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
9f30: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
9f40: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
9f50: 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
9f60: 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
9f70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9f80: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
9f90: 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
9fa0: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
9fb0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
9fc0: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
9fd0: 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
9fe0: 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
9ff0: 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
a000: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
a010: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
a020: 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
a030: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
a040: 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
a050: 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
a060: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
a070: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
a080: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
a090: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
a0a0: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
a0b0: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
a0c0: 65 73 65 72 76 65 29 7b 0a 20 20 42 74 53 68 61  eserve){.  BtSha
a0d0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
a0e0: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  t;.  if( pBt->pa
a0f0: 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
a100: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a110: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
a120: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
a130: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
a140: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
a150: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
a160: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67  e;.  }.  if( pag
a170: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
a180: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
a190: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
a1a0: 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
a1b0: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
a1c0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
a1d0: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
a1e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
a1f0: 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
a200: 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
a210: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
a220: 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
a230: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
a240: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
a250: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
a260: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
a270: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
a280: 6e 52 65 73 65 72 76 65 3b 0a 20 20 72 65 74 75  nReserve;.  retu
a290: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a2a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a2b0: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
a2c0: 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
a2d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
a2e0: 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
a2f0: 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
a300: 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
a310: 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
a320: 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
a330: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
a340: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
a350: 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
a360: 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  sableSize;.}../*
a370: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
a380: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
a390: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
a3a0: 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
a3b0: 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
a3c0: 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
a3d0: 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
a3e0: 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
a3f0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
a400: 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
a410: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
a420: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
a430: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
a440: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
a450: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
a460: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
a470: 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
a480: 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
a490: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ager, mxPage);.}
a4a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
a4b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a4c0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
a4d0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
a4e0: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
a4f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
a500: 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
a510: 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
a520: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
a530: 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
a540: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
a550: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
a560: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
a570: 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
a580: 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
a590: 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
a5a0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
a5b0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
a5c0: 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
a5d0: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
a5e0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
a5f0: 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
a600: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
a610: 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
a620: 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
a630: 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
a640: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a650: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
a660: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
a670: 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
a680: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
a690: 70 42 74 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20  pBt;.  int av = 
a6a0: 28 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29  (autoVacuum?1:0)
a6b0: 3b 0a 20 20 69 6e 74 20 69 76 20 3d 20 28 61 75  ;.  int iv = (au
a6c0: 74 6f 56 61 63 75 75 6d 3d 3d 42 54 52 45 45 5f  toVacuum==BTREE_
a6d0: 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3f  AUTOVACUUM_INCR?
a6e0: 31 3a 30 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  1:0);.  if( pBt-
a6f0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26  >pageSizeFixed &
a700: 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56  & av!=pBt->autoV
a710: 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74  acuum ){.    ret
a720: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
a730: 4e 4c 59 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  NLY;.  }.  pBt->
a740: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b  autoVacuum = av;
a750: 0a 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  .  pBt->incrVacu
a760: 75 6d 20 3d 20 69 76 3b 0a 20 20 72 65 74 75 72  um = iv;.  retur
a770: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
a780: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
a790: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
a7a0: 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
a7b0: 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
a7c0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
a7d0: 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
a7e0: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
a7f0: 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
a800: 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
a810: 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
a820: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
a830: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
a840: 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
a850: 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
a860: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
a870: 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
a880: 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
a890: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
a8a0: 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
a8b0: 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
a8c0: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
a8d0: 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
a8e0: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
a8f0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
a900: 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
a910: 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
a920: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a930: 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
a940: 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
a950: 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
a960: 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
a970: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
a980: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
a990: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
a9a0: 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
a9b0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
a9c0: 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
a9d0: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
a9e0: 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
a9f0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
aa00: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
aa10: 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
aa20: 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
aa30: 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
aa40: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
aa50: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
aa60: 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
aa70: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
aa80: 72 63 2c 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  rc, pageSize;.  
aa90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
aaa0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
aab0: 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e1 ) return SQLI
aac0: 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71  TE_OK;.  rc = sq
aad0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
aae0: 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
aaf0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
ab00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
ab10: 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a  urn rc;.  ..  /*
ab20: 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
ab30: 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
ab40: 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
ab50: 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
ab60: 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
ab70: 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
ab80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
ab90: 54 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69  TADB;.  if( sqli
aba0: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
abb0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30  t(pBt->pPager)>0
abc0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 61 67 65   ){.    u8 *page
abd0: 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
abe0: 61 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  a;.    if( memcm
abf0: 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
ac00: 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
ac10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
ac20: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
ac30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
ac40: 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
ac50: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
ac60: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
ac70: 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
ac80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
ac90: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
aca0: 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
acb0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
acc0: 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
acd0: 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
ace0: 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
acf0: 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 29 7b   pageSize<512 ){
ad00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
ad10: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
ad20: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
ad30: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
ad40: 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =0 );.    pBt->p
ad50: 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
ad60: 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
ad70: 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
ad80: 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
ad90: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 75 73 61      if( pBt->usa
ada0: 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20  bleSize<500 ){. 
adb0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
adc0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
add0: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45   }.    pBt->maxE
ade0: 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31  mbedFrac = page1
adf0: 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  [21];.    pBt->m
ae00: 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61  inEmbedFrac = pa
ae10: 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74  ge1[22];.    pBt
ae20: 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20  ->minLeafFrac = 
ae30: 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64  page1[23];.#ifnd
ae40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ae50: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
ae60: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
ae70: 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
ae80: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
ae90: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
aea0: 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
aeb0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
aec0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
aed0: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
aee0: 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
aef0: 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
af00: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
af10: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
af20: 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
af30: 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
af40: 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
af50: 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
af60: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
af70: 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
af80: 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
af90: 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
afa0: 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
afb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
afc0: 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
afd0: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
afe0: 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
aff0: 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
b000: 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
b010: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
b020: 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
b030: 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
b040: 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
b050: 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
b060: 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65   poiner, a heade
b070: 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
b080: 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
b090: 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
b0a0: 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
b0b0: 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
b0c0: 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
b0d0: 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
b0e0: 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
b0f0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42  ->maxLocal = (pB
b100: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
b110: 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46  )*pBt->maxEmbedF
b120: 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  rac/255 - 23;.  
b130: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
b140: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
b150: 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62  -12)*pBt->minEmb
b160: 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b  edFrac/255 - 23;
b170: 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
b180: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
b190: 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
b1a0: 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
b1b0: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42  sableSize-12)*pB
b1c0: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32  t->minLeafFrac/2
b1d0: 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70  55 - 23;.  if( p
b1e0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74  Bt->minLocal>pBt
b1f0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42  ->maxLocal || pB
b200: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b  t->maxLocal<0 ){
b210: 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f  .    goto page1_
b220: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  init_failed;.  }
b230: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
b240: 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
b250: 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
b260: 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
b270: 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72  e1 = pPage1;.  r
b280: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b290: 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
b2a0: 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
b2b0: 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
b2c0: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
b2d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b2e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b2f0: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63  e works like loc
b300: 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20  kBtree() except 
b310: 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76  that it also inv
b320: 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79  okes the.** busy
b330: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
b340: 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
b350: 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntion..*/.static
b360: 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69   int lockBtreeWi
b370: 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70  thRetry(Btree *p
b380: 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Ref){.  int rc =
b390: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
b3a0: 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d  ( pRef->inTrans=
b3b0: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
b3c0: 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74     u8 inTransact
b3d0: 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d  ion = pRef->pBt-
b3e0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  >inTransaction;.
b3f0: 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
b400: 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63  ty(pRef);.    rc
b410: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
b420: 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20  eginTrans(pRef, 
b430: 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42  0);.    pRef->pB
b440: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
b450: 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e   = inTransaction
b460: 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72  ;.    pRef->inTr
b470: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
b480: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
b490: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b4a0: 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61   pRef->pBt->nTra
b4b0: 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
b4c0: 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  }.    btreeInteg
b4d0: 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a  rity(pRef);.  }.
b4e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
b4f0: 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66        ../*.** If
b500: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
b510: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
b520: 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
b530: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
b540: 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
b550: 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
b560: 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
b570: 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
b580: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
b590: 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
b5a0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
b5b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
b5c0: 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
b5d0: 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
b5e0: 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
b5f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
b600: 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
b610: 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68  ding cursors, th
b620: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
b630: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
b640: 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
b650: 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
b660: 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
b670: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
b680: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
b690: 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
b6a0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
b6b0: 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
b6c0: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
b6d0: 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75  NONE && pBt->pCu
b6e0: 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e  rsor==0 && pBt->
b6f0: 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
b700: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
b710: 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
b720: 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20  Pager)>=1 ){.   
b730: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67     if( pBt->pPag
b740: 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a  e1->aData==0 ){.
b750: 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
b760: 2a 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50  *pPage = pBt->pP
b770: 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50  age1;.        pP
b780: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 26 28 28  age->aData = &((
b790: 75 38 2a 29 70 50 61 67 65 29 5b 2d 70 42 74 2d  u8*)pPage)[-pBt-
b7a0: 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20  >pageSize];.    
b7b0: 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
b7c0: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50   pBt;.        pP
b7d0: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  age->pgno = 1;. 
b7e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
b7f0: 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
b800: 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
b810: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
b820: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
b830: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
b840: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
b850: 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
b860: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
b870: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
b880: 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
b890: 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
b8a0: 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
b8b0: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
b8c0: 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
b8d0: 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
b8e0: 72 63 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rc;.  if( sqlite
b8f0: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
b900: 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
b910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b920: 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  K;.  pP1 = pBt->
b930: 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
b940: 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
b950: 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
b960: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
b970: 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
b980: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
b990: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b9a0: 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
b9b0: 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
b9c0: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
b9d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
b9e0: 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
b9f0: 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
ba00: 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
ba10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
ba20: 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
ba30: 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
ba40: 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d   data[20] = pBt-
ba50: 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
ba60: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
ba70: 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d  ata[21] = pBt->m
ba80: 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  axEmbedFrac;.  d
ba90: 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d  ata[22] = pBt->m
baa0: 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  inEmbedFrac;.  d
bab0: 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d  ata[23] = pBt->m
bac0: 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d 65  inLeafFrac;.  me
bad0: 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
bae0: 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
baf0: 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
bb00: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
bb10: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
bb20: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
bb30: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
bb40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
bb50: 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
bb60: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
bb70: 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
bb80: 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
bb90: 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
bba0: 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
bbb0: 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 23 65 6e  autoVacuum);.#en
bbc0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
bbd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
bbe0: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
bbf0: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
bc00: 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
bc10: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
bc20: 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
bc30: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
bc40: 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
bc50: 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
bc60: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
bc70: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
bc80: 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
bc90: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
bca0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
bcb0: 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
bcc0: 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
bcd0: 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
bce0: 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
bcf0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
bd00: 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
bd10: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
bd20: 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
bd30: 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
bd40: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
bd50: 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
bd60: 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
bd70: 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
bd80: 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
bd90: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
bda0: 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
bdb0: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
bdc0: 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
bdd0: 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
bde0: 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
bdf0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
be00: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
be10: 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
be20: 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
be30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
be40: 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
be50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
be60: 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
be70: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
be80: 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
be90: 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
bea0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
beb0: 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
bec0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
bed0: 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
bee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
bef0: 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
bf00: 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
bf10: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
bf20: 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
bf30: 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
bf40: 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
bf50: 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
bf60: 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
bf70: 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
bf80: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
bf90: 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
bfa0: 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
bfb0: 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
bfc0: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
bfd0: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
bfe0: 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
bff0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
c000: 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
c010: 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
c020: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
c030: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
c040: 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
c050: 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
c060: 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
c070: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
c080: 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
c090: 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
c0a0: 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
c0b0: 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
c0c0: 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
c0d0: 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
c0e0: 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
c0f0: 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
c100: 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
c110: 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
c120: 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
c130: 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
c140: 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
c150: 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
c160: 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
c170: 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
c180: 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
c190: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
c1a0: 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
c1b0: 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
c1c0: 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
c1d0: 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
c1e0: 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
c1f0: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
c200: 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
c210: 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
c220: 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
c230: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
c240: 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
c250: 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
c260: 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
c270: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c280: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
c290: 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
c2a0: 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ag){.  BtShared 
c2b0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
c2c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c2d0: 5f 4f 4b 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  _OK;..  btreeInt
c2e0: 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
c2f0: 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
c300: 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
c310: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
c320: 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
c330: 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
c340: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
c350: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
c360: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
c370: 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
c380: 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
c390: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
c3a0: 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
c3b0: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
c3c0: 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
c3d0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
c3e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
c3f0: 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
c400: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
c410: 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
c420: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
c430: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
c440: 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
c450: 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
c460: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
c470: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
c480: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
c490: 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
c4a0: 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
c4b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
c4c0: 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
c4d0: 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
c4e0: 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
c4f0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
c500: 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
c510: 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
c520: 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  E_BUSY..  */.  i
c530: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
c540: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
c550: 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  TE && wrflag ){.
c560: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c570: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 64  E_BUSY;.  }..  d
c580: 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  o {.    if( pBt-
c590: 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
c5a0: 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72      rc = lockBtr
c5b0: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 0a  ee(pBt);.    }..
c5c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c5d0: 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
c5e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  ){.      if( pBt
c5f0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
c600: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c610: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
c620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c630: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c640: 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
c650: 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72  ge1->pDbPage, wr
c660: 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
c670: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c680: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
c690: 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
c6a0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
c6b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c6c0: 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
c6d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c6e0: 20 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42   if( wrflag ) pB
c6f0: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
c700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c710: 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
c720: 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
c730: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
c740: 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
c750: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
c760: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
c770: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c780: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
c790: 72 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64  r(pBt->pBusyHand
c7a0: 6c 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  ler) );..  if( r
c7b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c7c0: 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
c7d0: 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
c7e0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
c7f0: 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20  ansaction++;.   
c800: 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
c810: 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
c820: 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
c830: 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
c840: 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
c850: 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
c860: 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
c870: 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
c880: 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ans;.    }.  }..
c890: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
c8a0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c8b0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
c8c0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
c8d0: 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
c8e0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
c8f0: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
c900: 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
c910: 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
c920: 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
c930: 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
c940: 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
c950: 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
c960: 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
c970: 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
c980: 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
c990: 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
c9a0: 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
c9b0: 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
c9c0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
c9f0: 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
ca00: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ca30: 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
ca40: 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
ca50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca70: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ca80: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
ca90: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
caa0: 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
cab0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
cac0: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
cad0: 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 73 71  age->pgno;..  sq
cae0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
caf0: 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ge(pPage, 0);.  
cb00: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
cb10: 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
cb20: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
cb30: 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
cb40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e   sqlite3BtreeFin
cb50: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
cb60: 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
cb70: 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
cb80: 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
cb90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cba0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
cbb0: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
cbc0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
cbd0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
cbe0: 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
cbf0: 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
cc00: 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
cc10: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
cc20: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
cc30: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
cc40: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
cc50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cc60: 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
cc70: 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
cc80: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
cc90: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
cca0: 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
ccb0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
ccc0: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
ccd0: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
cce0: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
ccf0: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
cd00: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
cd10: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74   pgno);.  }..set
cd20: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
cd30: 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
cd40: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
cd50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cd60: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
cd70: 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63  e on pPage, whic
cd80: 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  h is guarenteed 
cd90: 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61  to be a btree pa
cda0: 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66  ge, not an overf
cdb0: 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20  low.** page, is 
cdc0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
cdd0: 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20  e iFrom. Modify 
cde0: 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20  this pointer so 
cdf0: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
ce00: 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65  o.** iTo. Parame
ce10: 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
ce20: 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
ce30: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f  pointer to be mo
ce40: 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66  dified, as .** f
ce50: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
ce60: 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
ce70: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
ce80: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
ce90: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
cea0: 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
ceb0: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
cec0: 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
ced0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
cee0: 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
cef0: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
cf00: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
cf10: 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
cf40: 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
cf50: 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
cf60: 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
cf70: 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
cf80: 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
cf90: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
cfa0: 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
cfb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
cfc0: 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
cfd0: 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
cfe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
cff0: 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
d000: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
d010: 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
d020: 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
d030: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
d040: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
d050: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
d060: 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
d070: 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
d080: 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
d090: 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
d0a0: 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
d0b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
d0c0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
d0d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d0e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
d0f0: 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
d100: 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
d110: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
d120: 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  t isInitOrig = p
d130: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
d140: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
d150: 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c   nCell;..    sql
d160: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
d170: 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
d180: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
d190: 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
d1a0: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
d1b0: 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
d1c0: 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ell = sqlite3Btr
d1d0: 65 65 46 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  eeFindCell(pPage
d1e0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
d1f0: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
d200: 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
d210: 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
d220: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d230: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
d240: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
d250: 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
d260: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
d270: 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
d280: 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
d290: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
d2a0: 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
d2c0: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
d2d0: 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
d2e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
d2f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
d300: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
d310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d320: 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
d330: 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
d340: 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
d350: 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
d360: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d370: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d380: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
d390: 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
d3a0: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
d3b0: 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
d3c0: 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
d3d0: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
d3e0: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
d3f0: 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
d400: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d410: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d420: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
d430: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
d440: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
d450: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
d460: 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
d470: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
d480: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
d490: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d4a0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
d4b0: 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
d4c0: 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
d4d0: 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
d4e0: 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
d4f0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
d500: 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
d510: 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
d520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d530: 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
d540: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
d550: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
d560: 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
d570: 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
d580: 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
d590: 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
d5a0: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
d5b0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
d5c0: 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
d5d0: 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
d5e0: 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
d5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
d600: 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
d610: 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
d620: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
d630: 72 65 65 50 61 67 65 20 20 20 20 20 20 20 20 20  reePage         
d640: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
d650: 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
d660: 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  e to */.){.  Mem
d670: 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
d680: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
d690: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
d6a0: 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
d6b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
d6c0: 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
d6d0: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
d6e0: 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
d6f0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
d700: 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
d710: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
d720: 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
d730: 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
d740: 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
d750: 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
d760: 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
d770: 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  GE );..  /* Move
d780: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
d790: 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e 74 20  om it's current 
d7a0: 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
d7b0: 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
d7c0: 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
d7d0: 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
d7e0: 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
d7f0: 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
d800: 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
d810: 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
d820: 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
d830: 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
d840: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d850: 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
d860: 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
d870: 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20  e, iFreePage);. 
d880: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d890: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
d8a0: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
d8b0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
d8c0: 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
d8d0: 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
d8e0: 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
d8f0: 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
d900: 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
d910: 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
d920: 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
d930: 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
d940: 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
d950: 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
d960: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
d970: 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
d980: 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
d990: 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
d9a0: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
d9b0: 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
d9c0: 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
d9d0: 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
d9e0: 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
d9f0: 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
da00: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
da10: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
da20: 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
da30: 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
da40: 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
da50: 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
da60: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
da70: 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
da80: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
da90: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
daa0: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
dab0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
dac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dad0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
dae0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
daf0: 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
db00: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
db10: 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
db20: 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
db30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
db40: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
db50: 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
db60: 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
db70: 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  ePage);.      if
db80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
db90: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
dba0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
dbb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
dbc0: 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
dbd0: 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
dbe0: 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
dbf0: 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
dc00: 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
dc10: 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
dc20: 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
dc30: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
dc40: 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
dc50: 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
dc60: 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
dc70: 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
dc80: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
dc90: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
dca0: 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
dcb0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
dcc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dcd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dce0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
dcf0: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
dd00: 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
dd10: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
dd20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
dd30: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
dd40: 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
dd50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
dd60: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
dd70: 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
dd80: 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
dd90: 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
dda0: 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
ddb0: 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
ddc0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ddd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
dde0: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
ddf0: 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
de00: 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20  pe, iPtrPage);. 
de10: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
de20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
de30: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
de40: 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
de50: 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
de60: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
de70: 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
de80: 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
de90: 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
dea0: 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
deb0: 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
dec0: 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
ded0: 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
dee0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
def0: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
df00: 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
df10: 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
df20: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a  nd therefore no.
df30: 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c  ** point in call
df40: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
df50: 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
df60: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
df70: 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
df80: 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  cly, this functi
df90: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
dfa0: 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a  e-organize the .
dfb0: 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  ** database so t
dfc0: 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
dfd0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
dfe0: 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a  rrently in use.*
dff0: 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  * is no longer i
e000: 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n use..**.** If 
e010: 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74  the nFin paramet
e020: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
e030: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
e040: 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68  on assumes.** th
e050: 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
e060: 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
e070: 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
e080: 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74   until.** it ret
e090: 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
e0a0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e   or an error, an
e0b0: 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74  d that nFin is t
e0c0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
e0d0: 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61  pages the databa
e0e0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e  se file will con
e0f0: 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20  tain after this 
e100: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63  .** process is c
e110: 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74  omplete..*/.stat
e120: 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
e130: 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
e140: 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29 7b  pBt, Pgno nFin){
e150: 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 3b  .  Pgno iLastPg;
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e170: 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  Last page in the
e180: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
e190: 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
e1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e1b0: 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
e1c0: 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
e1d0: 73 74 20 2a 2f 0a 0a 20 20 69 4c 61 73 74 50 67  st */..  iLastPg
e1e0: 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
e1f0: 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30    if( iLastPg==0
e200: 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20   ){.    iLastPg 
e210: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
e220: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
e230: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
e240: 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
e250: 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
e260: 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
e270: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
e280: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
e290: 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
e2a0: 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
e2b0: 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
e2c0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
e2d0: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
e2e0: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
e2f0: 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69  eeList==0 || nFi
e300: 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20  n==iLastPg ){.  
e310: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e320: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
e330: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
e340: 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
e350: 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
e360: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
e370: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e380: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e390: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
e3a0: 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
e3b0: 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
e3c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e3d0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
e3e0: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
e3f0: 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
e400: 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
e410: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
e420: 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
e430: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
e440: 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
e450: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
e460: 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
e470: 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
e480: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
e490: 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
e4a0: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
e4b0: 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
e4c0: 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
e4d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
e4e0: 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
e4f0: 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
e500: 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
e510: 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
e520: 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
e530: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
e540: 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
e550: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
e560: 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
e570: 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
e580: 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
e590: 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
e5a0: 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
e5b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e5c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
e5d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
e5f0: 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
e600: 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
e610: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
e620: 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
e630: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
e640: 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e660: 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
e670: 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
e680: 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
e690: 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
e6a0: 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
e6b0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
e6c0: 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
e6d0: 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
e6e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e6f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e700: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
e710: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
e720: 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
e730: 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
e740: 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
e750: 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
e760: 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
e770: 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
e780: 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
e790: 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
e7a0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
e7b0: 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
e7c0: 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
e7d0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
e7e0: 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
e7f0: 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
e800: 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
e810: 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
e820: 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
e830: 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
e840: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
e850: 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
e860: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
e870: 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
e880: 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
e890: 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
e8a0: 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
e8b0: 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
e8c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e8d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e8e0: 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
e8f0: 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
e900: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e910: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
e920: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
e930: 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
e940: 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
e950: 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
e960: 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
e970: 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
e980: 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
e990: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
e9a0: 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
e9b0: 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
e9c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e9d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e9e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
e9f0: 20 7d 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72   } .      rc = r
ea00: 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
ea10: 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
ea20: 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
ea30: 50 67 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  Pg);.      relea
ea40: 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
ea50: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
ea60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ea70: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ea80: 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20       } .    }.  
ea90: 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63  }..  pBt->nTrunc
eaa0: 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a   = iLastPg - 1;.
eab0: 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54    while( pBt->nT
eac0: 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  runc==PENDING_BY
ead0: 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54  TE_PAGE(pBt)||PT
eae0: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
eaf0: 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b   pBt->nTrunc) ){
eb00: 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63  .    pBt->nTrunc
eb10: 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  --;.  }.  return
eb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
eb30: 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
eb40: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
eb50: 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
eb60: 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
eb70: 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
eb80: 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
eb90: 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
eba0: 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
ebb0: 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
ebc0: 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
ebd0: 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
ebe0: 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
ebf0: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
ec00: 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
ec10: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
ec20: 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
ec30: 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
ec40: 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53  or occured,.** S
ec50: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
ec60: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
ec70: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
ec80: 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
ec90: 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
eca0: 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
ecb0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
ecc0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
ecd0: 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
ece0: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
ecf0: 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
ed00: 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
ed10: 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
ed20: 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
ed30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
ed40: 4e 45 3b 0a 20 20 7d 0a 20 20 69 6e 76 61 6c 69  NE;.  }.  invali
ed50: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
ed60: 61 63 68 65 28 70 42 74 29 3b 0a 20 20 72 65 74  ache(pBt);.  ret
ed70: 75 72 6e 20 69 6e 63 72 56 61 63 75 75 6d 53 74  urn incrVacuumSt
ed80: 65 70 28 70 42 74 2c 20 30 29 3b 0a 7d 0a 0a 2f  ep(pBt, 0);.}../
ed90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
eda0: 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
edb0: 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
edc0: 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
edd0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
ede0: 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e   commited for an
edf0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
ee00: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
ee10: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
ee20: 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
ee30: 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
ee40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
ee50: 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
ee60: 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
ee70: 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
ee80: 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
ee90: 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
eea0: 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
eeb0: 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
eec0: 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
eed0: 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
eee0: 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
eef0: 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
ef00: 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
ef10: 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
ef20: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e  d *pBt, Pgno *pn
ef30: 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
ef40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ef50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
ef60: 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66  pBt->pPager;.#if
ef70: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
ef80: 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
ef90: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
efa0: 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
efb0: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
efc0: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
efd0: 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
efe0: 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
eff0: 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
f000: 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
f010: 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69  nFin = 0;..    i
f020: 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d  f( pBt->nTrunc==
f030: 30 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  0 ){.      Pgno 
f040: 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 50 67 6e  nFree;.      Pgn
f050: 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20  o nPtrmap;.     
f060: 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
f070: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  = pBt->pageSize;
f080: 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  .      Pgno nOri
f090: 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
f0a0: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
f0b0: 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 69  Pager);..      i
f0c0: 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
f0d0: 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a  (pBt, nOrig) ){.
f0e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f0f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f100: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
f110: 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e    if( nOrig==PEN
f120: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
f130: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
f140: 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Orig--;.      }.
f150: 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65        nFree = ge
f160: 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
f170: 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
f180: 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d  .      nPtrmap =
f190: 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
f1a0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
f1b0: 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f   nOrig)+pgsz/5)/
f1c0: 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20  (pgsz/5);.      
f1d0: 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
f1e0: 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
f1f0: 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e        if( nOrig>
f200: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
f210: 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d  E(pBt) && nFin<=
f220: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
f230: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
f240: 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20    nFin--;.      
f250: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 50  }.      while( P
f260: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
f270: 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
f280: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
f290: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
f2a0: 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20     nFin--;.     
f2b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68   }.    }..    wh
f2c0: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
f2d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
f2e0: 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
f2f0: 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  pBt, nFin);.    
f300: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
f310: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
f320: 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d     assert(nFin==
f330: 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63  0 || pBt->nTrunc
f340: 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74  ==0 || nFin<=pBt
f350: 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  ->nTrunc);.     
f360: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f370: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
f380: 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
f390: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72    sqlite3PagerWr
f3a0: 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
f3b0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
f3c0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
f3d0: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
f3e0: 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  32], 0);.       
f3f0: 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
f400: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
f410: 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
f420: 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69  Bt->nTrunc = nFi
f430: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
f440: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f450: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f460: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
f470: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
f480: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
f490: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f4a0: 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70      *pnTrunc = p
f4b0: 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20  Bt->nTrunc;.    
f4c0: 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
f4d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
f4e0: 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
f4f0: 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
f500: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
f510: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
f520: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f530: 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
f540: 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
f550: 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
f560: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
f570: 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
f580: 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
f590: 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
f5a0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
f5b0: 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
f5c0: 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
f5d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
f5e0: 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
f5f0: 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
f600: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
f610: 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
f620: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
f630: 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
f640: 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
f650: 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
f660: 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
f670: 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
f680: 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
f690: 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
f6a0: 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
f6b0: 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
f6c0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
f6d0: 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
f6e0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
f6f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
f700: 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
f710: 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
f720: 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
f730: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
f740: 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
f750: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
f760: 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
f770: 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
f780: 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
f790: 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
f7a0: 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
f7b0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
f7c0: 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
f7d0: 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
f7e0: 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
f7f0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
f800: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
f810: 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
f820: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
f830: 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
f840: 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
f850: 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
f860: 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
f870: 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
f880: 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
f890: 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
f8a0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
f8b0: 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
f8c0: 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
f8d0: 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
f8e0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
f8f0: 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
f900: 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
f910: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f920: 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
f930: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
f940: 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
f950: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
f960: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f970: 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
f980: 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
f990: 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
f9a0: 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
f9b0: 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
f9c0: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
f9d0: 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
f9e0: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
f9f0: 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
fa00: 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
fa10: 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
fa20: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
fa30: 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
fa40: 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
fa50: 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
fa60: 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
fa70: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fa80: 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
fa90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
faa0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
fab0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
fac0: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
fad0: 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
fae0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
faf0: 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e   p->pBt;.    Pgn
fb00: 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 69  o nTrunc = 0;.#i
fb10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fb20: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
fb30: 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
fb40: 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
fb50: 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
fb60: 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63  mit(pBt, &nTrunc
fb70: 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ); .      if( rc
fb80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fb90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
fba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fbb0: 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
fbc0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
fbd0: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
fbe0: 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
fbf0: 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 20 20   nTrunc);.  }.  
fc00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fc10: 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
fc20: 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
fc30: 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
fc40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
fc50: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
fc60: 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
fc70: 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
fc80: 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
fc90: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
fca0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
fcb0: 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
fcc0: 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  d should be invo
fcd0: 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ked.** prior to 
fce0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
fcf0: 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
fd00: 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
fd10: 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c  utine did.** all
fd20: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
fd30: 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
fd40: 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
fd50: 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
fd60: 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
fd70: 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
fd80: 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
fd90: 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
fda0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
fdb0: 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
fdc0: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
fdd0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
fde0: 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61  nal.** (which ca
fdf0: 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
fe00: 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
fe10: 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  and drop locks..
fe20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
fe30: 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
fe40: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
fe50: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
fe60: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
fe70: 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
fe80: 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
fe90: 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
fea0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
feb0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
fec0: 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
fed0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fee0: 70 2d 3e 70 42 74 3b 0a 0a 20 20 62 74 72 65 65  p->pBt;..  btree
fef0: 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
ff00: 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
ff10: 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
ff20: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
ff30: 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
ff40: 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
ff50: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
ff60: 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
ff70: 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
ff80: 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
ff90: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
ffa0: 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
ffb0: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
ffc0: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
ffd0: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
ffe0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
fff0: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
10000 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
10010 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
10020 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
10030 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
10040 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10050 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10060 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
10070 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
10080 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
10090 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
100a0 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41  0;.  }.  unlockA
100b0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
100c0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
100d0 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66   has any kind of
100e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
100f0 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
10100 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
10110 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  * count of the s
10120 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
10130 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10140 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c  count reaches 0,
10150 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68   set.  ** the sh
10160 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
10170 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
10180 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
10190 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20  d() call below. 
101a0 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20   ** will unlock 
101b0 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
101c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
101d0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
101e0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
101f0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
10200 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
10210 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
10220 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10230 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
10240 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10250 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20  Set the handles 
10260 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
10270 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
10280 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
10290 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
102a0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
102b0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
102c0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
102d0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
102e0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
102f0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f  ANS_NONE;.  unlo
10300 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
10310 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
10320 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65  tegrity(p);.  re
10330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10340 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
10350 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
10360 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
10370 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
10380 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
10390 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
103a0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
103b0 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
103c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
103d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
103e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
103f0 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a  haseTwo(p);.  }.
10400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10410 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
10420 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10430 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
10440 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
10450 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
10460 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
10470 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
10480 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
10490 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
104a0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
104b0 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  .** defined..*/.
104c0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
104d0 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
104e0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
104f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
10500 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
10510 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
10520 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
10530 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
10540 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
10550 61 67 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  ag ) r++; .  }. 
10560 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
10570 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  dif../*.** Rollb
10580 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
10590 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
105a0 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
105b0 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
105c0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
105d0 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
105e0 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
105f0 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
10600 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
10610 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
10620 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
10630 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
10640 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
10650 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
10660 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
10670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
10680 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
10690 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
106a0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
106b0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
106c0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
106d0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
106e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
106f0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
10700 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10710 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
10720 3b 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  ;..  rc = saveAl
10730 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
10740 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
10750 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10760 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
10770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10780 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
10790 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
107a0 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
107b0 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65  c() error occure
107c0 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
107d0 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
107e0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
107f0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
10800 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
10810 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
10820 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
10830 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
10840 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
10850 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
10860 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
10870 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
10880 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
10890 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
108a0 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
108b0 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
108c0 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
108d0 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
108e0 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
108f0 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
10900 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
10910 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
10920 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
10930 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
10940 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
10950 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pBt->pCursor ){
10960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
10970 64 62 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  db = pBt->pCurso
10980 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
10990 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  te;.      if( db
109a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
109b0 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74  te3AbortOtherAct
109c0 69 76 65 56 64 62 65 73 28 64 62 2c 20 30 29 3b  iveVdbes(db, 0);
109d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
109e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65   }.#endif.  btre
109f0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
10a00 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
10a10 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
10a20 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
10a30 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
10a40 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  c2;..#ifndef SQL
10a50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
10a60 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72  UUM.    pBt->nTr
10a70 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unc = 0;.#endif.
10a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
10a90 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
10aa0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
10ab0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
10ac0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
10ad0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
10ae0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
10af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
10b00 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
10b10 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
10b20 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
10b30 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
10b40 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
10b50 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71  o.    ** call sq
10b60 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
10b70 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
10b80 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
10b90 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
10ba0 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
10bb0 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
10bc0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  f( sqlite3BtreeG
10bd0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
10be0 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
10bf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10c00 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
10c10 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
10c20 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
10c30 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
10c40 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
10c50 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
10c60 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69  S_READ;.  }..  i
10c70 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
10c80 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
10c90 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
10ca0 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
10cb0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
10cc0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
10cd0 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
10ce0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
10cf0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10d00 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
10d10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
10d20 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
10d30 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53  NONE;.  pBt->inS
10d40 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63  tmt = 0;.  unloc
10d50 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
10d60 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
10d70 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65 74  egrity(p);.  ret
10d80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10d90 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
10da0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
10db0 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e 73  n.  The subtrans
10dc0 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61  action can.** ca
10dd0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
10de0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
10df0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
10e00 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d  action..** You m
10e10 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
10e20 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73  saction before s
10e30 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
10e40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
10e50 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
10e60 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
10e70 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61  ically if the ma
10e80 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  in transaction.*
10e90 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  * commits or rol
10ea0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  ls back..**.** O
10eb0 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73  nly one subtrans
10ec0 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
10ed0 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20  tive at a time. 
10ee0 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
10ef0 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61  to try.** to sta
10f00 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e  rt a new subtran
10f10 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68  saction if anoth
10f20 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  er subtransactio
10f30 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
10f40 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ive..**.** State
10f50 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
10f60 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
10f70 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
10f80 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
10f90 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
10fa0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
10fb0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
10fc0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
10fd0 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
10fe0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
10ff0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
11000 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
11010 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
11020 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
11030 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
11040 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
11050 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
11060 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
11070 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
11080 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
11090 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
110a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
110b0 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61  .  if( (p->inTra
110c0 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns!=TRANS_WRITE)
110d0 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20   || pBt->inStmt 
110e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
110f0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
11100 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
11110 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11120 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
11130 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11140 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
11150 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
11160 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nly ? SQLITE_OK 
11170 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  : sqlite3PagerSt
11180 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  mtBegin(pBt->pPa
11190 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 69 6e 53  ger);.  pBt->inS
111a0 74 6d 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  tmt = 1;.  retur
111b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
111c0 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d  Commit the statm
111d0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
111e0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
111f0 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f  progress.  If no
11200 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69  .** subtransacti
11210 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68  on is active, th
11220 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
11230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11240 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72  eeCommitStmt(Btr
11250 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
11260 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
11270 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
11280 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
11290 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
112a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
112b0 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
112c0 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  it(pBt->pPager);
112d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
112e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
112f0 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  }.  pBt->inStmt 
11300 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
11310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
11320 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73  ack the active s
11330 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
11340 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20  saction.  If no 
11350 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  subtransaction.*
11360 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73  * is active this
11370 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
11380 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  -op..**.** All c
11390 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
113a0 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
113b0 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
113c0 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  ny attempt.** to
113d0 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68   use a cursor th
113e0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
113f0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
11400 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  this operation.*
11410 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  * will result in
11420 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
11430 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
11440 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65  llbackStmt(Btree
11450 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
11460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
11470 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
11480 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 4d  >pBt;.  sqlite3M
11490 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 3b  allocDisallow();
114a0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
114b0 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
114c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
114d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
114e0 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  tRollback(pBt->p
114f0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
11500 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
11510 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
11520 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
11530 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
11540 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29  te3MallocAllow()
11550 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11560 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ../*.** Default 
11570 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  key comparison f
11580 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 73  unction to be us
11590 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61 72 69  ed if no compari
115a0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  son function.** 
115b0 69 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20  is specified on 
115c0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
115d0 43 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a  Cursor() call..*
115e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 66 6c  /.static int dfl
115f0 74 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64  tCompare(.  void
11600 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20   *NotUsed,      
11610 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64         /* User d
11620 61 74 61 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ata is not used 
11630 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63 6f 6e  */.  int n1, con
11640 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 20 20 20  st void *p1,    
11650 2f 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20  /* First key to 
11660 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74  compare */.  int
11670 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   n2, const void 
11680 2a 70 32 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  *p2     /* Secon
11690 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65  d key to compare
116a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a   */.){.  int c;.
116b0 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2c    c = memcmp(p1,
116c0 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e 31 20   p2, n1<n2 ? n1 
116d0 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20 63 3d 3d  : n2);.  if( c==
116e0 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20  0 ){.    c = n1 
116f0 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  - n2;.  }.  retu
11700 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn c;.}../*.** C
11710 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
11720 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
11730 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
11740 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
11750 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f  able.  The act o
11760 66 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75  f acquiring a cu
11770 72 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64  rsor gets a read
11780 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65   lock on .** the
11790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
117a0 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
117b0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
117c0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
117d0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
117e0 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
117f0 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
11800 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
11810 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
11820 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
11830 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
11840 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
11850 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
11860 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
11870 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
11880 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
11890 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
118a0 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
118b0 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
118c0 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
118d0 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
118e0 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
118f0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
11900 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
11910 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
11920 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
11930 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
11940 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
11950 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
11960 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
11970 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
11980 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
11990 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
119a0 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
119b0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
119c0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
119d0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
119e0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
119f0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
11a00 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
11a10 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
11a20 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
11a30 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
11a40 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
11a50 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
11a60 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
11a70 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
11a80 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
11a90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
11aa0 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
11ab0 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
11ac0 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
11ad0 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
11ae0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
11af0 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
11b00 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
11b10 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
11b20 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
11b30 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
11b40 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d  y..**.** The com
11b50 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
11b60 20 6d 75 73 74 20 62 65 20 6c 6f 67 69 63 61 6c   must be logical
11b70 6c 79 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  ly the same for 
11b80 65 76 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a 20  every cursor.** 
11b90 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
11ba0 74 61 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e 67  table.  Changing
11bb0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
11bc0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
11bd0 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72  sult.** in incor
11be0 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  rect operations.
11bf0 20 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69    If the compari
11c00 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  son function is 
11c10 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61 75  NULL, a.** defau
11c20 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  lt comparison fu
11c30 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nction is used. 
11c40 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
11c50 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
11c60 6c 77 61 79 73 20 69 67 6e 6f 72 65 64 20 66 6f  lways ignored fo
11c70 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2e  r INTKEY tables.
11c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11c90 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
11ca0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11cd0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
11ce0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
11d10 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
11d20 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
11d30 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
11d60 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
11d70 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d  y */.  int (*xCm
11d80 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  p)(void*,int,con
11d90 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
11da0 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65  st void*), /* Ke
11db0 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  y Comparison fun
11dc0 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  c */.  void *pAr
11dd0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
11e00 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
11e10 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70 70  .  BtCursor **pp
11e20 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e40 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
11e50 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
11e60 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
11e70 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68  or *pCur;.  BtSh
11e80 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11e90 42 74 3b 0a 0a 20 20 2a 70 70 43 75 72 20 3d 20  Bt;..  *ppCur = 
11ea0 30 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20  0;.  if( wrFlag 
11eb0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  ){.    if( pBt->
11ec0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
11ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ee0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
11ef0 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 61      if( checkRea
11f00 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65  dLocks(p, iTable
11f10 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
11f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
11f30 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
11f40 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
11f50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
11f60 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
11f70 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ry(p);.    if( r
11f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11f90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11fa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11fb0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
11fc0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrFlag ){.      
11fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
11fe0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
11ff0 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  }.  pCur = sqlit
12000 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
12010 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  *pCur) );.  if( 
12020 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pCur==0 ){.    r
12030 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
12040 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
12050 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
12060 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  on;.  }.  pCur->
12070 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
12080 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69  )iTable;.  if( i
12090 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69  Table==1 && sqli
120a0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
120b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
120c0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
120d0 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
120e0 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
120f0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
12100 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
12110 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
12120 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
12130 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20  ur->pPage, 0);. 
12140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12150 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
12160 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
12170 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  eption;.  }..  /
12180 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
12190 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
121a0 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
121b0 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
121c0 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
121d0 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75  les, link the cu
121e0 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
121f0 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20  Shared list and 
12200 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a  set *ppCur (the.
12210 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75    ** output argu
12220 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
12230 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70  ction)..  */.  p
12240 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20  Cur->xCompare = 
12250 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66  xCmp ? xCmp : df
12260 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75  ltCompare;.  pCu
12270 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  r->pArg = pArg;.
12280 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
12290 20 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c   p;.  pCur->wrFl
122a0 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70  ag = wrFlag;.  p
122b0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
122c0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
122d0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
122e0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
122f0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
12300 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
12310 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
12320 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
12330 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70  R_INVALID;.  *pp
12340 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72  Cur = pCur;..  r
12350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12360 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65  .create_cursor_e
12370 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20  xception:.  if( 
12380 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65  pCur ){.    rele
12390 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
123a0 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
123b0 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Free(pCur);.  }.
123c0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
123d0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
123e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
123f0 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a  0  /* Not Used *
12400 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  /./*.** Change t
12410 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
12420 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
12430 69 6f 6e 20 75 73 65 64 20 62 79 20 61 20 63 75  ion used by a cu
12440 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
12450 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 6f 6d  lite3BtreeSetCom
12460 70 61 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72  pare(.  BtCursor
12470 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 54   *pCur,     /* T
12480 68 65 20 63 75 72 73 6f 72 20 74 6f 20 77 68 6f  he cursor to who
12490 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  se comparison fu
124a0 6e 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65  nction is change
124b0 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70  d */.  int(*xCmp
124c0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
124d0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
124e0 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77  t void*), /* New
124f0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
12500 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
12510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
12520 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
12530 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43  Cmp() */.){.  pC
12540 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78  ur->xCompare = x
12550 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c  Cmp ? xCmp : dfl
12560 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72  tCompare;.  pCur
12570 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d  ->pArg = pArg;.}
12580 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12590 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
125a0 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
125b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
125c0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
125d0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
125e0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
125f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12600 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
12610 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
12620 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12630 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
12640 2d 3e 70 42 74 3b 0a 20 20 63 6c 65 61 72 43 75  ->pBt;.  clearCu
12650 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
12660 72 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r);.  if( pCur->
12670 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 43 75  pPrev ){.    pCu
12680 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
12690 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
126a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
126b0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
126c0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
126d0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
126e0 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
126f0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
12700 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c  pPrev;.  }.  rel
12710 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
12720 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42  Page);.  unlockB
12730 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
12740 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  );.  invalidateO
12750 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
12760 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  r);.  sqliteFree
12770 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
12780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12790 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70  *.** Make a temp
127a0 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20  orary cursor by 
127b0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66  filling in the f
127c0 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75  ields of pTempCu
127d0 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72  r..** The tempor
127e0 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  ary cursor is no
127f0 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  t on the cursor 
12800 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72  list for the Btr
12810 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
12820 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
12830 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
12840 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a  pCur, BtCursor *
12850 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 6d 65 6d  pTempCur){.  mem
12860 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43  cpy(pTempCur, pC
12870 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  ur, sizeof(*pCur
12880 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e  ));.  pTempCur->
12890 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65  pNext = 0;.  pTe
128a0 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30  mpCur->pPrev = 0
128b0 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43 75 72  ;.  if( pTempCur
128c0 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73  ->pPage ){.    s
128d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
128e0 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  TempCur->pPage->
128f0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
12900 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
12910 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
12920 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64   such as was mad
12930 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54  e by the CreateT
12940 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29  emporaryCursor()
12950 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f  .** function abo
12960 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ve..*/.void sqli
12970 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
12980 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
12990 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
129a0 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a   pCur->pPage ){.
129b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
129c0 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67  Unref(pCur->pPag
129d0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
129e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
129f0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
12a00 2e 69 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74  .info field of t
12a10 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
12a20 69 73 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20  is valid..** If 
12a30 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
12a40 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 20 73 71  y valid, call sq
12a50 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
12a60 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
12a70 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
12a80 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
12a90 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
12aa0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
12ab0 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
12ac0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
12ad0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
12ae0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73  er of calls to s
12af0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
12b00 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Cell()..*/.stati
12b10 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
12b20 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
12b30 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
12b40 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
12b50 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
12b60 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
12b70 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  >pPage, pCur->id
12b80 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  x, &pCur->info);
12b90 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65  .  }else{.#ifnde
12ba0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 43 65 6c  f NDEBUG.    Cel
12bb0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
12bc0 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
12bd0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
12be0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12bf0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
12c00 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
12c10 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
12c20 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
12c30 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
12c40 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
12c50 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  0 );.#endif.  }.
12c60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
12c70 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
12c80 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
12c90 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
12ca0 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
12cb0 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
12cc0 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
12cd0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
12ce0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
12cf0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
12d00 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
12d10 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
12d20 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
12d30 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
12d40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
12d50 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
12d60 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
12d70 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
12d80 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
12d90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12da0 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
12db0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
12dc0 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ze){.  int rc = 
12dd0 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
12de0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
12df0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
12e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
12e10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
12e20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
12e30 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
12e40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
12e50 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
12e60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
12e70 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
12e80 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
12e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12ea0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
12eb0 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
12ec0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
12ed0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  y;.    }.  }.  r
12ee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12ef0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
12f00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
12f10 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
12f20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
12f30 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
12f40 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c  y points to.  Al
12f50 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49  ways return SQLI
12f60 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72  TE_OK..** Failur
12f70 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
12f80 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
12f90 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  r is not current
12fa0 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ly.** pointing t
12fb0 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63  o an entry (whic
12fc0 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f  h can happen, fo
12fd0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
12fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
12ff0 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53   empty) then *pS
13000 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
13010 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13020 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
13030 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
13040 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
13050 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
13060 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
13070 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
13080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13090 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
130a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
130b0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
130c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
130d0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
130e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
130f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
13100 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  {.      /* Not p
13110 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
13120 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
13130 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
13140 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
13150 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13160 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
13170 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
13180 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
13190 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
131a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
131b0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
131c0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
131d0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
131e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
131f0 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
13200 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
13210 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
13220 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
13230 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
13240 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
13250 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
13260 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
13270 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
13280 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
13290 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
132a0 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
132b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
132c0 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
132d0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
132e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
132f0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
13300 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
13310 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
13320 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78 74  Unless pPgnoNext
13330 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61   is NULL, the pa
13340 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
13350 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a   next overflow .
13360 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ** page in the l
13370 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77 72  inked list is wr
13380 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
13390 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
133a0 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  l.** is the last
133b0 20 70 61 67 65 20 69 6e 20 69 74 27 73 20 6c 69   page in it's li
133c0 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e  nked list, *pPgn
133d0 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
133e0 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
133f0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
13400 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73  LL, *ppPage is s
13410 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  et to the MemPag
13420 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72  e* handle.** for
13430 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20   page ovfl. The 
13440 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72  underlying pager
13450 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62   page may have b
13460 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  een requested.**
13470 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74   with the noCont
13480 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f  ent flag set, so
13490 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61   the page data a
134a0 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a  ccessable via.**
134b0 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79   this handle may
134c0 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e   not be trusted.
134d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
134e0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
134f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
13500 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20   .  Pgno ovfl,  
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13520 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
13530 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
13540 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
13550 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
13560 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  age handle */.  
13570 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13590 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
135a0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
135b0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
135c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
135d0 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  .  /* One of the
135e0 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e  se must not be N
135f0 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
13600 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75  why call this fu
13610 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73  nction? */.  ass
13620 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70 50  ert(ppPage || pP
13630 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20  gnoNext);..  /* 
13640 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  If pPgnoNext is 
13650 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
13660 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
13670 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  g called to obta
13680 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67  in.  ** a MemPag
13690 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  e* reference onl
136a0 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20  y. No page-data 
136b0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
136c0 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  his case..  */. 
136d0 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74 20   if( !pPgnoNext 
136e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
136f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
13700 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50  e(pBt, ovfl, ppP
13710 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69  age, 1);.  }..#i
13720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13730 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
13740 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
13750 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
13760 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
13770 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
13780 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
13790 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
137a0 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
137b0 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
137c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
137d0 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
137e0 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
137f0 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
13800 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
13810 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
13820 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
13830 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
13840 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
13850 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
13860 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
13870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
13880 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
13890 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
138a0 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
138b0 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
138c0 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
138d0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
138e0 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
138f0 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
13900 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
13910 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
13920 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
13930 20 69 47 75 65 73 73 3c 3d 73 71 6c 69 74 65 33   iGuess<=sqlite3
13940 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
13950 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
13960 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
13970 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
13980 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
13990 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
139a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
139b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
139c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
139d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
139e0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
139f0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
13a00 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
13a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13a20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
13a30 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61   next==0 || ppPa
13a40 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  ge ){.    MemPag
13a50 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
13a60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13a70 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
13a80 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e   ovfl, &pPage, n
13a90 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73  ext!=0);.    ass
13aa0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
13ab0 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
13ac0 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
13ad0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
13ae0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
13af0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
13b00 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a  >aData);.    }..
13b10 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20 29      if( ppPage )
13b20 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  {.      *ppPage 
13b30 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c  = pPage;.    }el
13b40 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  se{.      releas
13b50 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
13b60 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f    }.  }.  *pPgno
13b70 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20  Next = next;..  
13b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13b90 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
13ba0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
13bb0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
13bc0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
13bd0 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
13be0 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
13bf0 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
13c00 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
13c10 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
13c20 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
13c30 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
13c40 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
13c50 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
13c60 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
13c70 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
13c80 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
13c90 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
13ca0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
13cb0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
13cc0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
13cd0 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
13ce0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
13cf0 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
13d00 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
13d10 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
13d20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13d30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
13d40 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
13d50 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
13d60 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
13d70 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
13d80 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
13d90 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
13da0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
13db0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
13dc0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13dd0 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
13de0 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
13df0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13e00 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
13e10 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
13e40 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
13e50 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
13e60 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
13e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
13e80 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
13e90 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
13ea0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
13eb0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
13ec0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
13ed0 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
13ee0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
13ef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
13f00 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
13f10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13f20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13f30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13f40 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
13f50 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
13f60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
13f70 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
13f80 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
13f90 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
13fa0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
13fb0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
13fc0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
13fd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
13ff0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
14000 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
14010 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
14020 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
14030 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
14040 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
14050 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
14060 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
14070 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
14080 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
14090 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
140a0 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
140b0 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
140c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
140d0 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
140e0 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
140f0 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
14100 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
14110 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
14120 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
14130 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
14140 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
14150 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
14160 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
14170 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
14180 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  es not make a di
14190 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
141a0 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a  n key and data..
141b0 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73  ** It just reads
141c0 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73   or writes bytes
141d0 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
141e0 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
141f0 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f  ght .** appear o
14200 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20  n the main page 
14210 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
14220 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
14230 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67  overflow .** pag
14240 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
14250 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
14260 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
14270 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
14280 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
14290 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
142a0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
142b0 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
142c0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
142d0 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
142e0 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
142f0 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
14300 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
14310 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
14320 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
14330 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
14340 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
14350 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
14360 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
14370 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
14380 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
14390 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
143a0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
143b0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
143c0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
143d0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
143e0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
143f0 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
14400 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
14410 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
14420 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
14430 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
14440 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
14450 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
14460 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
14470 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
14480 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
14490 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
144a0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
144b0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
144c0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
144d0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
144e0 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
144f0 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
14500 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
14510 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
14520 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
14530 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
14540 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
14550 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
14560 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
14570 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
14580 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
14590 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20  .  int offset,  
145a0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
145b0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
145c0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
145d0 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
145e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
145f0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
14600 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14610 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
14620 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
14630 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
14640 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  / .  int skipKey
14650 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  ,         /* off
14660 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61  set begins at da
14670 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
14680 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20  ue */.  int eOp 
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
146a0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
146b0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
146c0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
146d0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
146e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
146f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
14700 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
14710 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
14720 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
14730 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74  ge;        /* Bt
14740 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
14750 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
14760 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
14770 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
14780 65 65 2d 3e 70 42 74 3b 20 20 20 2f 2a 20 42 74  ee->pBt;   /* Bt
14790 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
147a0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
147b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
147c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
147d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
147e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
147f0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
14800 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
14810 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
14820 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
14830 30 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  0 );..  getCellI
14840 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
14850 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
14860 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
14870 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
14880 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
14890 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75  intKey ? 0 : pCu
148a0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a  r->info.nKey);..
148b0 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
148c0 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e  .    offset += n
148d0 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  Key;.  }.  if( o
148e0 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
148f0 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
14900 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  a ){.    /* Tryi
14910 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
14920 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
14930 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
14940 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
14950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14960 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ROR;.  }..  /* C
14970 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
14980 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
14990 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
149a0 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
149b0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
149c0 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
149d0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
149e0 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
149f0 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
14a00 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
14a10 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
14a20 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
14a30 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
14a40 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
14a50 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
14a60 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
14a70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
14a80 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
14a90 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
14aa0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
14ab0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
14ac0 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
14ad0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
14ae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14af0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
14b00 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69  const int ovflSi
14b10 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
14b20 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
14b30 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
14b40 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
14b50 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
14b60 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
14b70 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
14b80 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
14b90 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66  ocal]);..#ifndef
14ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
14bb0 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20  RBLOB.    /* If 
14bc0 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  the isIncrblobHa
14bd0 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
14be0 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f   and the BtCurso
14bf0 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20  r.aOverflow[].  
14c00 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
14c10 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
14c20 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ocate it now. Th
14c30 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  e array is sized
14c40 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65   at.    ** one e
14c50 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
14c60 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
14c70 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
14c80 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61  n. The.    ** pa
14c90 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
14ca0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
14cb0 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
14cc0 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a  n aOverflow[0],.
14cd0 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61      ** etc. A va
14ce0 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
14cf0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
14d00 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  y means "not yet
14d10 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28   known".    ** (
14d20 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
14d30 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
14d40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14d50 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
14d60 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e  andle && !pCur->
14d70 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
14d80 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
14d90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
14da0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
14db0 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
14dc0 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
14dd0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
14de0 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69  w = (Pgno *)sqli
14df0 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
14e00 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
14e10 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
14e20 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
14e30 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
14e40 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
14e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14e60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
14e70 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
14e80 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
14e90 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
14ea0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
14eb0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
14ec0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
14ed0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
14ee0 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
14ef0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
14f00 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
14f10 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
14f20 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
14f30 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
14f40 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
14f50 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
14f60 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
14f70 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
14f80 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
14f90 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
14fa0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
14fb0 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
14fc0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
14fd0 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
14fe0 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
14ff0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15000 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
15010 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
15020 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
15030 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
15040 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
15050 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
15060 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
15070 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
15080 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
15090 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
150a0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
150b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
150c0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
150d0 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
150e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
150f0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
15100 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
15110 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
15120 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
15130 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
15140 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
15150 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
15160 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
15170 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
15180 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
15190 61 67 65 0a 09 2a 2a 20 64 61 74 61 20 69 73 20  age..** data is 
151a0 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
151b0 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
151c0 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
151d0 77 0a 09 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20  w..** page-list 
151e0 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
151f0 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
15200 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
15210 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
15220 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
15230 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
15240 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
15250 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
15260 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
15270 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
15280 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
15290 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
152a0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
152b0 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
152c0 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
152d0 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
152e0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
152f0 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
15300 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
15310 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 72          assert(r
15320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
15330 6e 65 78 74 50 61 67 65 3d 3d 30 29 3b 0a 20 20  nextPage==0);.  
15340 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
15350 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
15360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
15370 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
15380 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
15390 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
153a0 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
153b0 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
153c0 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
153d0 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
153e0 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
153f0 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
15400 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
15410 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
15420 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
15430 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15440 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
15450 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
15460 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
15470 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
15480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15490 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
154a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
154b0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
154c0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
154d0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
154e0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
154f0 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
15500 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
15510 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
15520 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
15530 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15540 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
15550 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
15560 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
15570 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
15580 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
15590 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
155a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
155b0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
155c0 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
155d0 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
155e0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
155f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15600 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
15610 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
15620 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
15630 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
15640 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
15650 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15660 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
15670 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
15680 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
15690 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
156a0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
156b0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
156c0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
156d0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
156e0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
156f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
15700 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
15710 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
15720 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
15730 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
15740 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
15750 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
15760 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
15770 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
15780 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
15790 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
157a0 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
157b0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
157c0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
157d0 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  uf){.  int rc = 
157e0 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
157f0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
15800 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
15810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
15820 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
15830 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
15840 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
15850 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
15860 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
15870 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  >pPage->intKey )
15880 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15890 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
158a0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
158b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
158c0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  e->intKey==0 );.
158d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
158e0 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
158f0 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
15900 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
15910 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
15920 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
15930 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
15940 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30  char*)pBuf, 0, 0
15950 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15960 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
15970 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
15980 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
15990 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
159a0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
159b0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
159c0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
159d0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
159e0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
159f0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
15a00 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
15a10 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
15a20 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
15a30 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
15a40 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
15a50 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
15a60 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
15a70 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
15a80 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
15a90 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
15aa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
15ab0 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
15ac0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
15ad0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
15ae0 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  f){.  int rc = r
15af0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
15b00 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
15b10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
15b20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
15b30 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
15b40 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
15b50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15b60 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
15b70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
15b80 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
15b90 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
15ba0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
15bb0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
15bc0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
15bd0 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c  t, amt, pBuf, 1,
15be0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
15bf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
15c00 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
15c10 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
15c20 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
15c30 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
15c40 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
15c50 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
15c60 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
15c70 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
15c80 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
15c90 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
15ca0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
15cb0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
15cc0 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
15cd0 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
15ce0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
15cf0 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
15d00 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
15d10 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
15d20 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
15d30 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
15d40 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
15d50 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
15d60 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15d70 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
15d80 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
15d90 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
15da0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
15db0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
15dc0 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
15dd0 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
15de0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
15df0 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
15e00 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
15e10 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
15e20 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
15e30 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
15e40 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
15e50 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
15e60 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
15e70 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
15e80 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
15e90 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
15ea0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
15eb0 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a  to reassembly.**
15ec0 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
15ed0 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
15ee0 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
15ef0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
15f00 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
15f10 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
15f20 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
15f30 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
15f40 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
15f50 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
15f60 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
15f70 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
15f80 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
15f90 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
15fa0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
15fb0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
15fc0 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
15fd0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
15fe0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
15ff0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
16000 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
16010 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
16020 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
16030 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
16040 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
16050 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
16060 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
16070 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
16080 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
16090 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
160a0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
160b0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
160c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
160d0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
160e0 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  t nLocal;..  ass
160f0 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
16100 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
16110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
16120 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
16130 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67  _VALID );.  pPag
16140 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
16150 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
16160 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
16170 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
16180 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
16190 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
161a0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
161b0 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
161c0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
161d0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
161e0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
161f0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
16200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
16210 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
16220 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
16230 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
16240 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
16250 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
16260 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
16270 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
16280 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
16290 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
162a0 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
162b0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
162c0 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
162d0 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
162e0 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
162f0 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
16300 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
16310 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
16320 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
16330 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
16340 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
16350 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
16360 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
16370 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
16380 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
16390 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
163a0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
163b0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
163c0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
163d0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
163e0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
163f0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
16400 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
16410 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
16420 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
16430 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
16440 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
16450 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
16460 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
16470 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
16480 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
16490 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
164a0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
164b0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
164c0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
164d0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
164e0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
164f0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
16500 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
16510 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
16520 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
16530 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
16540 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
16550 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
16560 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
16570 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
16580 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
16590 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70 43 75  pAmt){.  if( pCu
165a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
165b0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
165c0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
165d0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
165e0 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
165f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16600 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
16610 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
16620 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
16630 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
16640 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
16650 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
16660 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
16670 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
16680 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
16690 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
166a0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
166b0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
166c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
166d0 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
166e0 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68  pOldPage;.  BtSh
166f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
16700 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a  ->pBtree->pBt;..
16710 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
16720 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
16730 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 67  ALID );.  rc = g
16740 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
16750 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
16760 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50 61  wPage, pCur->pPa
16770 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
16780 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65  return rc;.  pNe
16790 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  wPage->idxParent
167a0 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20   = pCur->idx;.  
167b0 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d  pOldPage = pCur-
167c0 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61  >pPage;.  pOldPa
167d0 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
167e0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
167f0 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75  pOldPage);.  pCu
16800 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50  r->pPage = pNewP
16810 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78  age;.  pCur->idx
16820 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
16830 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
16840 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
16850 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
16860 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16870 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
16880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
168a0 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
168b0 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c  e is the virtual
168c0 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62   root of its tab
168d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69  le..**.** The vi
168e0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
168f0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
16900 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73   for most tables
16910 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68  .  But.** for th
16920 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f  e table rooted o
16930 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69  n page 1, someti
16940 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  me the real root
16950 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74   page.** is empt
16960 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  y except for the
16970 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20   right-pointer. 
16980 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74   In such cases t
16990 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f  he.** virtual ro
169a0 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70  ot page is the p
169b0 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67  age that the rig
169c0 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61  ht-pointer of pa
169d0 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74  ge.** 1 is point
169e0 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
169f0 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f  qlite3BtreeIsRoo
16a00 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
16a10 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
16a20 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67   *pParent = pPag
16a30 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66  e->pParent;.  if
16a40 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72  ( pParent==0 ) r
16a50 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
16a60 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29  Parent->pgno>1 )
16a70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
16a80 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65   get2byte(&pPare
16a90 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
16aa0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  t->hdrOffset+3])
16ab0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
16ac0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16ad0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
16ae0 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
16af0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
16b00 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
16b10 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
16b20 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
16b30 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
16b40 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
16b50 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
16b60 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
16b70 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
16b80 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
16b90 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
16ba0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
16bb0 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
16bc0 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
16bd0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
16be0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
16bf0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
16c00 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
16c10 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  age *pParent;.  
16c20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
16c30 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b    int idxParent;
16c40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
16c50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
16c60 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67  _VALID );.  pPag
16c70 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
16c80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16c90 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
16ca0 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73   !sqlite3BtreeIs
16cb0 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
16cc0 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  );.  pParent = p
16cd0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
16ce0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
16cf0 21 3d 30 20 29 3b 0a 20 20 69 64 78 50 61 72 65  !=0 );.  idxPare
16d00 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  nt = pPage->idxP
16d10 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
16d20 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
16d30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65  ->pDbPage);.  re
16d40 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
16d50 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20  ;.  pCur->pPage 
16d60 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75  = pParent;.  pCu
16d70 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
16d80 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
16d90 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d  rent->idxShift==
16da0 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78  0 );.  pCur->idx
16db0 20 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a   = idxParent;.}.
16dc0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
16dd0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f  cursor to the ro
16de0 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69  ot page.*/.stati
16df0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
16e00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
16e10 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
16e20 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
16e30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
16e40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
16e50 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a  ->pBtree->pBt;..
16e60 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
16e70 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te==CURSOR_REQUI
16e80 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 63 6c  RESEEK ){.    cl
16e90 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
16ea0 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70  n(pCur);.  }.  p
16eb0 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
16ec0 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 20  ge;.  if( pRoot 
16ed0 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  && pRoot->pgno==
16ee0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
16ef0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  {.    assert( pR
16f00 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  oot->isInit );. 
16f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
16f20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  .      SQLITE_OK
16f30 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  !=(rc = getAndIn
16f40 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
16f50 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  ->pgnoRoot, &pRo
16f60 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a 20  ot, 0)).    ){. 
16f70 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
16f80 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
16f90 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
16fa0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
16fb0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
16fc0 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75  >pPage);.    pCu
16fd0 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74  r->pPage = pRoot
16fe0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64  ;.  }.  pCur->id
16ff0 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
17000 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
17010 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
17020 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
17030 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
17040 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73   subpage;.    as
17050 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
17060 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
17070 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
17080 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
17090 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
170a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
170b0 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
170c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
170d0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
170e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
170f0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
17100 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
17110 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70  tate = ((pCur->p
17120 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Page->nCell>0)?C
17130 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
17140 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72  OR_INVALID);.  r
17150 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17160 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
17170 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
17180 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
17190 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
171a0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
171b0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
171c0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
171d0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
171e0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
171f0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
17200 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
17210 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
17220 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
17230 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
17240 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
17250 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
17260 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
17270 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
17280 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
17290 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
172a0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
172b0 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
172c0 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
172d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
172e0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
172f0 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
17300 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
17310 20 3d 20 67 65 74 34 62 79 74 65 28 73 71 6c 69   = get4byte(sqli
17320 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c  te3BtreeFindCell
17330 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
17340 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  x));.    rc = mo
17350 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
17360 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
17370 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
17380 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17390 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
173a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
173b0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
173c0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
173d0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
173e0 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
173f0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
17400 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
17410 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
17420 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
17430 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
17440 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
17450 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
17460 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
17470 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
17480 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
17490 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
174a0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
174b0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
174c0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
174d0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
174e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
174f0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
17500 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
17510 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
17520 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
17530 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
17540 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
17550 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
17560 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
17570 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
17580 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
17590 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
175a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
175b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
175c0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
175d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
175e0 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
175f0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
17600 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
17610 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
17620 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  8]);.    pCur->i
17630 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  dx = pPage->nCel
17640 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
17650 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
17660 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
17670 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
17680 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70  .  pCur->idx = p
17690 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b  Page->nCell - 1;
176a0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
176b0 69 7a 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ize = 0;.  retur
176c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
176d0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
176e0 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
176f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
17700 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
17710 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
17720 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
17730 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
17740 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
17750 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
17760 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
17770 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
17780 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
17790 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
177a0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
177b0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
177c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
177d0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
177e0 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
177f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
17800 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17810 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
17820 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
17830 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
17840 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
17850 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
17860 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17870 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
17880 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
17890 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
178a0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
178b0 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
178c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
178d0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
178e0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
178f0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
17900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
17910 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
17920 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
17930 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
17940 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
17950 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
17960 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
17970 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
17980 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
17990 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
179a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
179b0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
179c0 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  c;.  rc = moveTo
179d0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
179e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
179f0 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
17a00 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
17a10 74 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65  tate ){.    asse
17a20 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
17a30 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
17a40 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
17a50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17a60 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17a70 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17a80 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
17a90 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 63 20  *pRes = 0;.  rc 
17aa0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
17ab0 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
17ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
17ad0 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
17ae0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
17af0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 70   an entry near p
17b00 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74  Key/nKey..** Ret
17b10 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
17b20 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
17b30 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c  TKEY tables, onl
17b40 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d  y the nKey param
17b50 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
17b60 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
17b70 64 2e 20 20 46 6f 72 20 6f 74 68 65 72 20 74 61  d.  For other ta
17b80 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73 20 74 68  bles, nKey is th
17b90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17ba0 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 69 6e 20  s of data.** in 
17bb0 70 4b 65 79 2e 20 20 54 68 65 20 63 6f 6d 70 61  pKey.  The compa
17bc0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 73  rison function s
17bd0 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 74 68  pecified when th
17be0 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
17bf0 63 72 65 61 74 65 64 20 69 73 20 75 73 65 64 20  created is used 
17c00 74 6f 20 63 6f 6d 70 61 72 65 20 6b 65 79 73 2e  to compare keys.
17c10 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
17c20 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
17c30 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
17c40 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
17c50 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
17c60 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
17c70 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
17c80 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
17c90 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
17ca0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
17cb0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
17cc0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
17cd0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
17ce0 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
17cf0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f  .** The result o
17d00 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
17d10 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
17d20 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a  ry to which the.
17d30 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69  ** cursor is wri
17d40 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66  tten to *pRes if
17d50 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68   pRes!=NULL.  Th
17d60 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20  e meaning of.** 
17d70 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73  this value is as
17d80 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
17d90 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
17da0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
17db0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
17dc0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
17df0 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65  n pKey or if the
17e00 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
17e10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17e20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
17e30 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
17e40 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
17e50 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
17e60 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
17e70 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
17e80 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
17e90 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
17eb0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70  xactly matches p
17ec0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
17ed0 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
17ee0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
17ef0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
17f00 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
17f20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79  larger than pKey
17f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17f40 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42  BtreeMoveto(.  B
17f50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
17f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
17f70 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
17f80 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
17f90 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
17fa0 68 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66  he key content f
17fb0 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  or indices.  Not
17fc0 20 75 73 65 64 20 62 79 20 74 61 62 6c 65 73 20   used by tables 
17fd0 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17ff0 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72  ize of pKey.  Or
18000 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62   the key for tab
18010 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  les */.  int bia
18020 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
18030 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
18040 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
18050 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
18060 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
18070 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
18080 68 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f  h result flag */
18090 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
180a0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
180b0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
180c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61  ) return rc;.  a
180d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
180e0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
180f0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49  pCur->pPage->isI
18100 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nit );.  if( pCu
18110 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18120 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
18130 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
18140 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18150 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
18160 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18170 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f  ITE_OK;.  }.  fo
18180 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
18190 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
181a0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
181b0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
181c0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
181d0 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20  int c = -1;  /* 
181e0 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74  pRes return if t
181f0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75  able is empty mu
18200 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20  st be -1 */.    
18210 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
18220 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
18230 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  1;.    if( !pPag
18240 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65  e->intKey && pKe
18250 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  y==0 ){.      re
18260 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18270 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
18280 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
18290 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
182a0 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20  >idx = upr;.    
182b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
182c0 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77  r->idx = (upr+lw
182d0 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
182e0 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66  if( lwr<=upr ) f
182f0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f  or(;;){.      vo
18300 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
18310 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
18320 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
18330 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
18340 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
18350 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
18360 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
18370 20 20 20 20 70 43 65 6c 6c 20 3d 20 73 71 6c 69      pCell = sqli
18380 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c  te3BtreeFindCell
18390 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
183a0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
183b0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
183c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
183d0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
183e0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
183f0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
18400 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
18410 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  l, &dummy);.    
18420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
18430 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
18440 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  u64 *)&nCellKey)
18450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
18460 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20  ellKey<nKey ){. 
18470 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
18480 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
18490 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79  f( nCellKey>nKey
184a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
184b0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = +1;.        }e
184c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
184d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
184e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
184f0 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62       int availab
18500 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  le;.        pCel
18510 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66  lKey = (void *)f
18520 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
18530 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29  , &available, 0)
18540 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b  ;.        nCellK
18550 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
18560 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nKey;.        if
18570 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65  ( available>=nCe
18580 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  llKey ){.       
18590 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f     c = pCur->xCo
185a0 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67  mpare(pCur->pArg
185b0 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  , nCellKey, pCel
185c0 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
185d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
185e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  {.          pCel
185f0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c  lKey = sqliteMal
18600 6c 6f 63 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79  locRaw( nCellKey
18610 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
18620 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20  ( pCellKey==0 ) 
18630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
18640 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  MEM;.          r
18650 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18660 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
18670 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70  llKey, (void *)p
18680 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
18690 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43      c = pCur->xC
186a0 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72  ompare(pCur->pAr
186b0 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65  g, nCellKey, pCe
186c0 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65  llKey, nKey, pKe
186d0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
186e0 6c 69 74 65 46 72 65 65 28 70 43 65 6c 6c 4b 65  liteFree(pCellKe
186f0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
18700 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
18710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18720 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
18730 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
18740 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  ( pPage->leafDat
18750 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  a && !pPage->lea
18760 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
18770 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a  wr = pCur->idx;.
18780 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
18790 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
187a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
187b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
187c0 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
187d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
187e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
187f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
18800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18810 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
18820 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b  lwr = pCur->idx+
18830 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
18840 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 70 43          upr = pC
18850 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20  ur->idx-1;.     
18860 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72   }.      if( lwr
18870 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >upr ){.        
18880 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18890 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
188a0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20   (lwr+upr)/2;.  
188b0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
188c0 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
188d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
188e0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
188f0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
18900 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
18910 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
18920 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
18930 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
18940 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
18950 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
18960 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
18970 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18980 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
18990 34 62 79 74 65 28 73 71 6c 69 74 65 33 42 74 72  4byte(sqlite3Btr
189a0 65 65 46 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  eeFindCell(pPage
189b0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
189c0 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
189d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
189e0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
189f0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
18a00 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
18a10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ;.      if( pRes
18a20 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20   ) *pRes = c;.  
18a30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18a40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18a50 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b  pCur->idx = lwr;
18a60 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
18a70 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72  nSize = 0;.    r
18a80 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
18a90 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
18aa0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
18ab0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18ac0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54    }.  }.  /* NOT
18ad0 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f   REACHED */.}../
18ae0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
18af0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
18b00 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
18b10 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
18b20 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
18b30 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
18b40 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
18b50 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
18b60 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
18b70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
18b80 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
18b90 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
18ba0 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
18bb0 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
18bc0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
18bd0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
18be0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
18bf0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
18c00 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
18c10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
18c20 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
18c30 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
18c40 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
18c50 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
18c60 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
18c70 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
18c80 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
18c90 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
18ca0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
18cb0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
18cc0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
18cd0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
18ce0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
18cf0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
18d00 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
18d10 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
18d20 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
18d30 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
18d40 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
18d50 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
18d60 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
18d70 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
18d80 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
18d90 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
18da0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
18db0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
18dc0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
18dd0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
18de0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
18df0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18e00 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
18e10 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
18e20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
18e30 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
18e40 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
18e50 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
18e60 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
18e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18e80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
18e90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
18ea0 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  es!=0 );.  pPage
18eb0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
18ec0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
18ed0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
18ee0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
18ef0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
18f00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
18f10 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
18f20 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
18f30 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
18f40 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
18f50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18f60 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
18f70 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
18f80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
18f90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18fa0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
18fb0 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78   );..  pCur->idx
18fc0 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ++;.  pCur->info
18fd0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
18fe0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
18ff0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
19000 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
19010 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
19020 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
19030 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
19040 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
19050 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
19060 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
19070 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19080 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
19090 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
190a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
190b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
190c0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
190d0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
190e0 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
190f0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  e) ){.        *p
19100 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
19110 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
19120 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
19130 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
19140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
19150 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
19160 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
19170 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
19180 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
19190 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
191a0 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
191b0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
191c0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
191d0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
191e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
191f0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
19200 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
19210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19230 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
19240 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
19250 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
19260 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
19270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19280 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
19290 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
192a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
192b0 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
192c0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
192d0 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
192e0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
192f0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
19300 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
19310 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
19320 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
19330 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
19340 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
19350 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
19360 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
19370 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
19380 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
19390 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
193a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
193b0 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
193c0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
193d0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
193e0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d  Pgno pgno;.  Mem
193f0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
19400 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
19410 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
19420 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
19430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19440 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19450 20 7d 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f   }.  if( CURSOR_
19460 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
19470 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
19480 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
19490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
194a0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
194b0 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip<0 ){.    pCur
194c0 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
194d0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
194e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
194f0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
19500 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
19510 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
19520 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
19530 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
19540 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
19550 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
19560 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
19570 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20 73  no = get4byte( s
19580 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64 43  qlite3BtreeFindC
19590 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
195a0 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20  >idx) );.    rc 
195b0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
195c0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
195d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
195e0 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
195f0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
19600 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19610 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
19620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
19630 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52   sqlite3BtreeIsR
19640 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
19650 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
19660 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
19670 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
19680 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
19690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
196a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
196b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
196c0 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
196d0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
196e0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
196f0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
19700 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e  dx--;.    pCur->
19710 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
19720 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
19730 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67  eafData && !pPag
19740 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
19750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
19760 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
19770 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
19780 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
19790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
197a0 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
197b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
197c0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
197d0 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
197e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
197f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
19800 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
19810 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
19820 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
19830 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
19840 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
19850 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
19860 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
19870 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
19880 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
19890 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
198a0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
198b0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
198c0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
198d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
198e0 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
198f0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
19900 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
19910 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
19920 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
19930 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
19940 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
19950 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
19960 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
19970 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
19980 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
19990 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
199a0 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65  voke sqlite3Page
199b0 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  rUnref() on *ppP
199c0 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
199d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
199e0 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
199f0 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
19a00 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66  not 0, then a (f
19a10 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73  eeble) effort is
19a20 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
19a30 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
19a40 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
19a50 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
19a60 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
19a70 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
19a80 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
19a90 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
19aa0 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
19ab0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19ac0 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
19ad0 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
19ae0 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
19af0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
19b00 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65  "exact" paramete
19b10 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20  r is not 0, and 
19b20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
19b30 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a  nearby exists .*
19b40 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
19b50 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
19b60 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65  n it is guarente
19b70 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
19b80 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  d. This.** is on
19b90 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  ly used by auto-
19ba0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
19bb0 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
19bc0 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f   a new table..*/
19bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
19be0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
19bf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
19c00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
19c10 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
19c20 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
19c30 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
19c40 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
19c50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
19c60 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20    int n;     /* 
19c70 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19c80 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
19c90 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20  */.  int k;     
19ca0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
19cb0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
19cc0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
19cd0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
19ce0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
19cf0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
19d00 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 31 20   = 0;..  pPage1 
19d10 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
19d20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
19d30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
19d40 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  );.  if( n>0 ){.
19d50 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
19d60 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
19d70 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
19d80 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
19d90 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
19da0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
19db0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
19dc0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
19dd0 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
19de0 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
19df0 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
19e00 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
19e10 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
19e20 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
19e30 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
19e40 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
19e50 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
19e60 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
19e70 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
19e80 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
19e90 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
19ea0 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
19eb0 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
19ec0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
19ed0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19ee0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61  CUUM.    if( exa
19ef0 63 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ct ){.      u8 e
19f00 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
19f10 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
19f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
19f30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
19f40 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
19f50 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
19f60 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
19f70 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
19f80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
19f90 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
19fa0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
19fb0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
19fc0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
19fd0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
19fe0 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
19ff0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
1a000 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
1a010 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
1a020 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
1a030 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
1a040 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
1a050 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
1a060 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
1a070 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
1a080 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a090 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1a0a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1a0b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1a0c0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
1a0d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1a0e0 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
1a0f0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
1a100 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
1a110 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
1a120 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
1a130 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
1a140 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
1a150 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
1a160 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1a170 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
1a180 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
1a190 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
1a1a0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
1a1b0 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
1a1c0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
1a1d0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
1a1e0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
1a1f0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1a200 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
1a210 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1a220 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
1a230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a240 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1a250 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1a260 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
1a270 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
1a280 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1a290 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
1a2a0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
1a2b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1a2c0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1a2d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1a2e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1a2f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
1a300 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1a310 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1a320 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
1a330 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
1a340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1a350 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
1a360 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
1a370 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
1a380 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
1a390 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
1a3a0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
1a3b0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
1a3c0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
1a3d0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
1a3e0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
1a3f0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
1a400 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
1a410 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a420 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1a430 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1a440 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1a450 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1a460 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1a470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a480 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
1a490 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
1a4a0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1a4b0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1a4c0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1a4d0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1a4e0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
1a4f0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1a500 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1a510 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
1a520 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
1a530 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
1a540 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
1a550 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61  e if( k>pBt->usa
1a560 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
1a570 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
1a580 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
1a590 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
1a5a0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
1a5b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1a5c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1a5d0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1a5e0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1a5f0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a600 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1a610 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a620 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
1a630 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
1a640 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1a650 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
1a660 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
1a670 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
1a680 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1a690 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
1a6a0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1a6b0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
1a6c0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1a6d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
1a6e0 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
1a6f0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1a700 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1a710 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1a720 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
1a730 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1a740 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1a750 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1a760 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1a770 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1a780 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1a790 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
1a7a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a7b0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1a7c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1a7d0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1a7e0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1a7f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1a800 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1a810 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1a820 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
1a830 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1a840 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1a850 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a860 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1a870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1a880 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
1a890 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
1a8a0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
1a8b0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
1a8c0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
1a8d0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
1a8e0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
1a8f0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
1a900 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
1a910 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1a920 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1a930 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1a940 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
1a950 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
1a960 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1a970 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
1a980 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1a990 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a9a0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
1a9b0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
1a9c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1a9d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a9f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1aa00 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1aa10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1aa20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1aa30 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
1aa40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1aa50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1aa60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aa70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1aa80 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1aa90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1aaa0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1aab0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1aac0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1aad0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1aae0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1aaf0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1ab00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ab10 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1ab20 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1ab30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1ab40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
1ab50 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1ab60 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
1ab70 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1ab80 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1ab90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1aba0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1abb0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1abc0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1abd0 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
1abe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1abf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1ac00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ac10 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
1ac20 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1ac30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1ac40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ac50 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1ac60 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1ac70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ac80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
1ac90 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1aca0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1acb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1acc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
1acd0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1ace0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1acf0 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1ad00 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1ad10 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1ad20 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
1ad30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ad40 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
1ad50 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
1ad60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1ad70 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
1ad80 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
1ad90 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
1ada0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
1adb0 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
1adc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1add0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1ade0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1adf0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1ae00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1ae10 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1ae20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ae30 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
1ae40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1ae50 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
1ae60 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1ae70 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1ae80 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1ae90 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
1aea0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
1aeb0 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
1aec0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
1aed0 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
1aee0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1aef0 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
1af00 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
1af10 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1af20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
1af30 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
1af40 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
1af50 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1af60 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1af80 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
1af90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1afa0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1afb0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
1afc0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1afd0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
1afe0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
1aff0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1b000 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1b010 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
1b020 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
1b030 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
1b040 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
1b050 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71     if( *pPgno>sq
1b060 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1b070 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1b080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b090 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66  /* Free page off
1b0a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b0b0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
1b0c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b0d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b0e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b0f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1b100 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
1b110 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
1b120 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
1b130 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
1b140 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
1b150 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1b160 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
1b170 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
1b180 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
1b190 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
1b1a0 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
1b1b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1b1c0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1b1d0 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
1b1e0 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
1b1f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1b200 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
1b210 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1b220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b230 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1b240 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
1b250 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   1);.          i
1b260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b280 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1b290 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67  Rollback((*ppPag
1b2a0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
1b2b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1b2c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1b2d0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
1b2e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1b2f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b310 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1b320 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
1b330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1b350 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1b360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b370 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1b380 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
1b390 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
1b3a0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
1b3b0 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
1b3c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b3d0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
1b3e0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1b3f0 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
1b400 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
1b410 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
1b420 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70  e file */.    *p
1b430 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 50 61  Pgno = sqlite3Pa
1b440 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1b450 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a  ->pPager) + 1;..
1b460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b470 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1b480 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1b490 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nc ){.      /* A
1b4a0 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68 61  n incr-vacuum ha
1b4b0 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77 69  s already run wi
1b4c0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
1b4d0 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20  ction. So the.  
1b4e0 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20 61      ** page to a
1b4f0 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20 66  llocate is not f
1b500 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61 6c  rom the physical
1b510 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1b520 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  , but.      ** a
1b530 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a  t pBt->nTrunc. .
1b540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a        */.      *
1b550 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72  pPgno = pBt->nTr
1b560 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  unc+1;.      if(
1b570 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
1b580 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1b590 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50 67  ){.        (*pPg
1b5a0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  no)++;.      }. 
1b5b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1b5c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
1b5d0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1b5e0 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
1b5f0 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
1b600 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
1b610 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
1b620 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
1b630 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
1b640 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1b650 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
1b660 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
1b670 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
1b680 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
1b690 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
1b6a0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
1b6b0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
1b6c0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
1b6d0 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
1b6e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
1b6f0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
1b700 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1b710 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
1b720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1b730 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1b740 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1b750 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1b760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b770 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
1b780 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63       pBt->nTrunc
1b790 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d   = *pPgno;.    }
1b7a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
1b7b0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1b7c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1b7d0 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
1b7e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1b7f0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
1b800 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
1b810 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1b820 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
1b830 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1b840 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1b850 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1b860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b870 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1b880 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
1b890 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1b8a0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
1b8b0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
1b8c0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
1b8d0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1b8e0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1b8f0 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
1b900 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
1b910 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1b920 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
1b930 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
1b940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b950 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20  *.** Add a page 
1b960 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1b970 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65  file to the free
1b980 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  list..**.** sqli
1b990 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1b9a0 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f  is NOT called fo
1b9b0 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
1b9c0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
1b9d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1b9e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b9f0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1ba00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1ba10 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1ba20 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a    int rc, n, k;.
1ba30 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68  .  /* Prepare th
1ba40 65 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69  e page for freei
1ba50 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ng */.  assert( 
1ba60 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
1ba70 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
1ba80 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1ba90 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65  age(pPage->pPare
1baa0 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50  nt);.  pPage->pP
1bab0 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  arent = 0;..  /*
1bac0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
1bad0 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
1bae0 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
1baf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1bb00 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1bb10 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1bb20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1bb30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1bb40 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1bb50 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
1bb60 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1bb70 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  n+1);..#ifdef SQ
1bb80 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1bb90 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
1bba0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1bbb0 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
1bbc0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
1bbd0 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
1bbe0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
1bbf0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
1bc00 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
1bc10 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ros..  */.  rc =
1bc20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1bc30 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1bc40 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1bc50 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73  eturn rc;.  mems
1bc60 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1bc70 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
1bc80 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69  pageSize);.#endi
1bc90 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1bca0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1bcb0 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  M.  /* If the da
1bcc0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1bcd0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
1bce0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
1bcf0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1bd00 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
1bd10 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
1bd20 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
1bd30 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1bd40 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
1bd50 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
1bd60 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
1bd70 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
1bd80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1bd90 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1bda0 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  f..  if( n==0 ){
1bdb0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1bdc0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1bdd0 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  age */.    rc = 
1bde0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1bdf0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1be00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1be10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d  return rc;.    m
1be20 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
1be30 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70  ta, 0, 8);.    p
1be40 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1be50 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67  >aData[32], pPag
1be60 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52  e->pgno);.    TR
1be70 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1be80 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50   %d first\n", pP
1be90 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
1bea0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68  else{.    /* Oth
1beb0 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c  er free pages al
1bec0 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65  ready exist.  Re
1bed0 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20  trive the first 
1bee0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a  trunk page.    *
1bef0 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  * of the freelis
1bf00 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68  t and find out h
1bf10 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69  ow many leaves i
1bf20 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65  t has. */.    Me
1bf30 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20  mPage *pTrunk;. 
1bf40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1bf50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1bf60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1bf70 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26  1->aData[32]), &
1bf80 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1bf90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1bfa0 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34  rc;.    k = get4
1bfb0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1bfc0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
1bfd0 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53   k>=pBt->usableS
1bfe0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1bff0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1c000 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74  is full.  Turn t
1c010 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
1c020 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20  eed into a new. 
1c030 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61       ** trunk pa
1c040 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65  ge with no leave
1c050 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  s. */.      rc =
1c060 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1c070 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1c080 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1c090 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1c0a0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1c0b0 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e  ge->aData, pTrun
1c0c0 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  k->pgno);.      
1c0d0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1c0e0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
1c0f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1c100 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1c110 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1c120 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
1c130 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
1c140 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
1c150 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20  cing %d\n",.    
1c160 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
1c170 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70  >pgno, pTrunk->p
1c180 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
1c190 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74  {.      /* Add t
1c1a0 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70  he newly freed p
1c1b0 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e  age as a leaf on
1c1c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75   the current tru
1c1d0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  nk */.      rc =
1c1e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1c1f0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1c200 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
1c210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c220 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1c230 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1c240 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20  4], k+1);.      
1c250 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
1c260 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d  nk->aData[8+k*4]
1c270 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1c280 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
1c290 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
1c2a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1c2b0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
1c2c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64  ->pDbPage);.#end
1c2d0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
1c2e0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1c2f0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
1c300 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
1c310 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
1c320 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1c330 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1c340 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
1c350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c360 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
1c370 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
1c380 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1c390 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
1c3a0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
1c3b0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
1c3c0 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
1c3d0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
1c3e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1c3f0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
1c400 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
1c410 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
1c420 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
1c430 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67  l;.  int ovflPag
1c440 65 53 69 7a 65 3b 0a 0a 20 20 73 71 6c 69 74 65  eSize;..  sqlite
1c450 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
1c460 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1c470 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
1c480 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
1c490 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c4a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
1c4b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1c4c0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
1c4d0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
1c4e0 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
1c4f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
1c500 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
1c510 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  w]);.  ovflPageS
1c520 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
1c530 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
1c540 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
1c550 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
1c560 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
1c570 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
1c580 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
1c590 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
1c5a0 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
1c5b0 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
1c5c0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a  MemPage *pOvfl;.
1c5d0 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
1c5e0 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  ==0 || ovflPgno>
1c5f0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1c600 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1c610 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
1c620 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1c630 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1c640 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
1c650 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
1c660 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28  lPgno, &pOvfl, (
1c670 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66  nOvfl==0)?0:&ovf
1c680 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
1c690 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1c6a0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
1c6b0 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
1c6c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c6d0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
1c6e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1c6f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
1c700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1c720 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
1c730 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
1c740 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
1c750 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
1c760 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
1c770 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
1c780 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
1c790 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
1c7a0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
1c7b0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
1c7c0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
1c7d0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
1c7e0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1c7f0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
1c800 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
1c810 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
1c820 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
1c830 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1c840 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
1c850 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
1c860 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1c870 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
1c880 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
1c890 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
1c8a0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
1c8b0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
1c8c0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
1c8d0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
1c8e0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
1c8f0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
1c900 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
1c910 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1c920 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
1c930 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c950 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1c960 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
1c970 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
1c980 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
1c990 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
1c9a0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
1c9b0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
1c9c0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
1c9d0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
1c9e0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
1c9f0 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
1ca00 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
1ca10 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
1ca20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ca30 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
1ca40 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
1ca50 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
1ca60 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
1ca90 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
1caa0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
1cab0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
1cac0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
1cad0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
1cae0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
1caf0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
1cb00 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
1cb10 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
1cb20 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
1cb30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1cb40 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
1cb50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1cb60 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
1cb70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
1cb80 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
1cb90 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
1cba0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
1cbb0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
1cbc0 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
1cbd0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1cbe0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
1cbf0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1cc00 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
1cc10 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
1cc20 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
1cc30 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65  ader], nData+nZe
1cc40 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ro);.  }else{.  
1cc50 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20    nData = nZero 
1cc60 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
1cc70 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
1cc80 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
1cc90 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
1cca0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
1ccb0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
1ccc0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1ccd0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
1cce0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
1ccf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
1cd00 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
1cd10 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
1cd20 6e 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65  nData==nData+nZe
1cd30 72 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  ro );.  .  /* Fi
1cd40 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
1cd50 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
1cd60 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
1cd70 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
1cd80 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
1cd90 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
1cda0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
1cdb0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
1cdc0 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  se{.    nPayload
1cdd0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53   += nKey;.    pS
1cde0 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
1cdf0 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  Src = nKey;.  }.
1ce00 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
1ce10 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
1ce20 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
1ce30 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
1ce40 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
1ce50 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
1ce60 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
1ce70 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
1ce80 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
1ce90 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
1cea0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1ceb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1cec0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
1ced0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
1cee0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
1cef0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
1cf00 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
1cf10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
1cf20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1cf30 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
1cf40 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
1cf50 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
1cf60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1cf70 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
1cf80 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1cf90 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
1cfa0 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
1cfb0 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
1cfc0 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
1cfd0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
1cfe0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
1cff0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
1d000 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
1d010 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
1d020 74 20 70 61 67 65 20 6e 6f 77 2e 20 54 68 65 20  t page now. The 
1d030 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1d040 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
1d050 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
1d060 2a 2a 20 61 64 64 65 64 20 6c 61 74 65 72 2c 20  ** added later, 
1d070 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
1d080 6c 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  l() routine..   
1d090 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d0a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1d0b0 26 26 20 70 67 6e 6f 50 74 72 6d 61 70 21 3d 30  && pgnoPtrmap!=0
1d0c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1d0d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1d0e0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
1d0f0 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
1d100 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 70 67 6e  P_OVERFLOW2, pgn
1d110 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
1d120 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
1d130 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1d140 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
1d150 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
1d160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d170 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1d180 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
1d190 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
1d1a0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
1d1b0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
1d1c0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
1d1d0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
1d1e0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
1d1f0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
1d200 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
1d210 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
1d220 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
1d230 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
1d240 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1d250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
1d260 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
1d270 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
1d280 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  n = spaceLeft;. 
1d290 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
1d2a0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
1d2b0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
1d2c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1d2d0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
1d2e0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
1d2f0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
1d300 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1d310 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
1d320 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
1d330 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
1d340 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
1d350 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
1d360 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
1d370 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
1d380 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
1d390 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
1d3a0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
1d3b0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
1d3c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1d3d0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
1d3e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d3f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
1d400 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  the MemPage.pPar
1d410 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74  ent pointer on t
1d420 68 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75  he page whose nu
1d430 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e  mber is.** given
1d440 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
1d450 72 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  rgument so that 
1d460 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
1d470 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69  holds the.** poi
1d480 6e 74 65 72 20 69 6e 20 74 68 65 20 74 68 69 72  nter in the thir
1d490 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
1d4a0 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65  tatic int repare
1d4b0 6e 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20  ntPage(BtShared 
1d4c0 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pBt, Pgno pgno,
1d4d0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
1d4e0 72 65 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a  rent, int idx){.
1d4f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73    MemPage *pThis
1d500 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
1d510 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1d520 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b  pNewParent!=0 );
1d530 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
1d540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d550 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  K;.  assert( pBt
1d560 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
1d570 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
1d580 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
1d590 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
1d5a0 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
1d5b0 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28  ){.    pThis = (
1d5c0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
1d5d0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
1d5e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1d5f0 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29   pThis->isInit )
1d600 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1d610 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 28 73  pThis->aData==(s
1d620 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1d630 74 61 28 70 44 62 50 61 67 65 29 29 20 29 3b 0a  ta(pDbPage)) );.
1d640 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
1d650 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61  >pParent!=pNewPa
1d660 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
1d670 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
1d680 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  nt ) sqlite3Page
1d690 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50  rUnref(pThis->pP
1d6a0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
1d6b0 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e  .        pThis->
1d6c0 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61  pParent = pNewPa
1d6d0 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71  rent;.        sq
1d6e0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 4e  lite3PagerRef(pN
1d6f0 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  ewParent->pDbPag
1d700 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1d710 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65    pThis->idxPare
1d720 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a  nt = idx;.    }.
1d730 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1d740 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
1d750 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1d760 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d770 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
1d780 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1d790 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
1d7a0 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52  t(pBt, pgno, PTR
1d7b0 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50  MAP_BTREE, pNewP
1d7c0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
1d7d0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1d7e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d7f0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1d800 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  he pParent point
1d810 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  er of all childr
1d820 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70  en of pPage to p
1d830 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  oint back.** to 
1d840 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pPage..**.** In 
1d850 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72  other words, for
1d860 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20   every child of 
1d870 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65  pPage, invoke re
1d880 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20  parentPage().** 
1d890 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1d8a0 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f  t each child kno
1d8b0 77 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73  ws that pPage is
1d8c0 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   its parent..**.
1d8d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d8e0 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65  gets called afte
1d8f0 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f  r you memcpy() o
1d900 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20  ne page into.** 
1d910 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  another..*/.stat
1d920 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43  ic int reparentC
1d930 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67  hildPages(MemPag
1d940 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1d950 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   i;.  BtShared *
1d960 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1d970 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1d980 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
1d990 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74  Page->leaf ) ret
1d9a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1d9b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
1d9c0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
1d9d0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
1d9e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e   sqlite3BtreeFin
1d9f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1da00 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1da10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1da20 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65  c = reparentPage
1da30 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
1da40 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29  Cell), pPage, i)
1da50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1da60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1da70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1da80 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1da90 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eaf ){.    rc = 
1daa0 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74  reparentPage(pBt
1dab0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
1dac0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1dad0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a  hdrOffset+8]), .
1dae0 20 20 20 20 20 20 20 70 50 61 67 65 2c 20 69 29         pPage, i)
1daf0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78  ;.    pPage->idx
1db00 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  Shift = 0;.  }. 
1db10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1db20 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
1db30 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
1db40 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
1db50 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
1db60 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
1db70 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
1db80 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
1db90 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
1dba0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1dbb0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1dbc0 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
1dbd0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
1dbe0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
1dbf0 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
1dc00 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
1dc10 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
1dc20 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
1dc30 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
1dc40 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1dc50 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
1dc60 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
1dc70 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1dc80 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
1dc90 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1dca0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1dcb0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
1dcc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
1dcd0 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
1dce0 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
1dcf0 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
1dd00 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
1dd10 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
1dd20 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
1dd30 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
1dd40 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
1dd50 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
1dd60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  /..  assert( idx
1dd70 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
1dd80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
1dd90 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
1dda0 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
1ddb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ddc0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1ddd0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1dde0 65 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  e) );.  data = p
1ddf0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
1de00 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
1de10 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
1de20 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
1de30 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61  t2byte(ptr);.  a
1de40 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20  ssert( pc>10 && 
1de50 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42  pc+sz<=pPage->pB
1de60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
1de70 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61  .  freeSpace(pPa
1de80 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66  ge, pc, sz);.  f
1de90 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
1dea0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
1deb0 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
1dec0 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
1ded0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
1dee0 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
1def0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
1df00 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
1df10 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
1df20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
1df30 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
1df40 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   2;.  pPage->idx
1df50 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Shift = 1;.}../*
1df60 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
1df70 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
1df80 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
1df90 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
1dfa0 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
1dfb0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
1dfc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
1dfd0 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
1dfe0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
1dff0 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
1e000 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
1e010 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
1e020 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
1e030 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
1e040 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
1e050 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
1e060 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
1e070 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
1e080 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
1e090 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   in pPage->aOvfl
1e0a0 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
1e0b0 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
1e0c0 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
1e0d0 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
1e0e0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
1e0f0 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
1e100 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
1e110 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
1e120 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
1e130 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
1e140 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
1e150 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
1e160 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
1e170 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20  .** If nSkip is 
1e180 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64  non-zero, then d
1e190 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66  o not copy the f
1e1a0 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73  irst nSkip bytes
1e1b0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e   of the.** cell.
1e1c0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1e1d0 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20   overwrite them 
1e1e0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1e1f0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a  ion returns. If.
1e200 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  ** nSkip is non-
1e210 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c  zero, then pCell
1e220 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74   may not point t
1e230 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d  o an invalid mem
1e240 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a  ory location .**
1e250 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69   (but pCell+nSki
1e260 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  p is always vali
1e270 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
1e280 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  t insertCell(.  
1e290 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1e2a0 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
1e2b0 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
1e2c0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
1e2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1e2e0 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
1e2f0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
1e300 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
1e310 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
1e320 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
1e330 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
1e340 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
1e350 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
1e360 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
1e370 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
1e380 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
1e390 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
1e3a0 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
1e3b0 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20   */.  u8 nSkip  
1e3c0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1e3d0 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73  t write the firs
1e3e0 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
1e3f0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a   the cell */.){.
1e400 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
1e410 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
1e420 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
1e430 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
1e440 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
1e450 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1e460 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
1e470 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f   top;          /
1e480 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
1e490 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
1e4a0 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a  cell in data[] *
1e4b0 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
1e4c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
1e4d0 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
1e4e0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
1e4f0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
1e500 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
1e510 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
1e520 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
1e530 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
1e540 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68  erted */.  int h
1e550 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dr;          /* 
1e560 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61  Offset into data
1e570 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  [] of the page h
1e580 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
1e590 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
1e5a0 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
1e5b0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
1e5c0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
1e5d0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
1e5e0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
1e5f0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
1e600 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
1e610 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
1e620 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
1e630 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
1e640 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  data[] */..  ass
1e650 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
1e660 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
1e670 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
1e680 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
1e690 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
1e6a0 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  , pCell) );.  as
1e6b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1e6c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
1e6d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
1e6e0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
1e6f0 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
1e700 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
1e710 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
1e720 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
1e730 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
1e740 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
1e750 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
1e760 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
1e770 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
1e780 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
1e790 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70  sert( j<sizeof(p
1e7a0 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
1e7b0 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
1e7c0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  [0]) );.    pPag
1e7d0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
1e7e0 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
1e7f0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
1e800 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67  dx = i;.    pPag
1e810 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  e->nFree = 0;.  
1e820 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20  }else{.    data 
1e830 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
1e840 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
1e850 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
1e860 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
1e870 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
1e880 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
1e890 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
1e8a0 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
1e8b0 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
1e8c0 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20  ->nCell + 2;.   
1e8d0 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
1e8e0 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28  t + 2*i;.    if(
1e8f0 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20   end > top - sz 
1e900 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
1e910 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
1e920 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  (pPage);.      i
1e930 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e940 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e950 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
1e960 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
1e970 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e980 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
1e990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
1e9a0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
1e9b0 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
1e9c0 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
1e9d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
1e9e0 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
1e9f0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
1ea00 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
1ea10 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
1ea20 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
1ea30 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
1ea40 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
1ea50 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
1ea60 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
1ea70 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
1ea80 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
1ea90 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
1eaa0 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
1eab0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
1eac0 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
1ead0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
1eae0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
1eaf0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
1eb00 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
1eb10 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64  );.    pPage->id
1eb20 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e  xShift = 1;.#ifn
1eb30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1eb40 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1eb50 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
1eb60 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1eb70 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
1eb80 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
1eb90 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
1eba0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
1ebb0 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
1ebc0 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
1ebd0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
1ebe0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
1ebf0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
1ec00 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1ec10 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fo;.      sqlite
1ec20 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
1ec30 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1ec40 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61   &info);.      a
1ec50 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
1ec60 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
1ec70 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
1ec80 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
1ec90 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66  ;.      if( (inf
1eca0 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
1ecb0 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
1ecc0 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
1ecd0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
1ece0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
1ecf0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
1ed00 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
1ed10 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70        int rc = p
1ed20 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
1ed30 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  pBt, pgnoOvfl, P
1ed40 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
1ed50 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
1ed60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1ed70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1ed80 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1ed90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
1eda0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1edb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
1edc0 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
1edd0 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
1ede0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
1edf0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
1ee00 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
1ee10 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1ee20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
1ee30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ee40 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
1ee50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1ee60 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
1ee70 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
1ee80 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
1ee90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
1eea0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
1eeb0 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
1eec0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
1eed0 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
1eee0 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
1eef0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69  es */.  int *aSi
1ef00 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
1ef10 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
1ef20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1ef30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1ef40 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
1ef50 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20  nt totalSize;   
1ef60 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
1ef70 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20  f all cells */. 
1ef80 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
1ef90 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70     /* Index of p
1efa0 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
1efb0 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20  int cellptr;    
1efc0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1efd0 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
1efe0 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
1eff0 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
1f000 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
1f010 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64   body */.  u8 *d
1f020 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
1f030 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  Data for the pag
1f040 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1f050 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
1f060 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69  ==0 );.  totalSi
1f070 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ze = 0;.  for(i=
1f080 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1f090 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20  {.    totalSize 
1f0a0 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d  += aSize[i];.  }
1f0b0 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c  .  assert( total
1f0c0 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50  Size+2*nCell<=pP
1f0d0 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20  age->nFree );.  
1f0e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
1f0f0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c  Cell==0 );.  cel
1f100 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65  lptr = pPage->ce
1f110 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  llOffset;.  data
1f120 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
1f130 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
1f140 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74  hdrOffset;.  put
1f150 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
1f160 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66  3], nCell);.  if
1f170 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63  ( nCell ){.    c
1f180 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61  ellbody = alloca
1f190 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74  teSpace(pPage, t
1f1a0 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61  otalSize);.    a
1f1b0 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e  ssert( cellbody>
1f1c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1f1d0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d   pPage->nFree >=
1f1e0 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20   2*nCell );.    
1f1f0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
1f200 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72  2*nCell;.    for
1f210 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1f220 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62  ++){.      put2b
1f230 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74  yte(&data[cellpt
1f240 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  r], cellbody);. 
1f250 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
1f260 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43  a[cellbody], apC
1f270 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d  ell[i], aSize[i]
1f280 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72  );.      cellptr
1f290 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c   += 2;.      cel
1f2a0 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69  lbody += aSize[i
1f2b0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  ];.    }.    ass
1f2c0 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70  ert( cellbody==p
1f2d0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
1f2e0 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70  eSize );.  }.  p
1f2f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43  Page->nCell = nC
1f300 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
1f310 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
1f320 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
1f330 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
1f340 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
1f350 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
1f360 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
1f370 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
1f380 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
1f390 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
1f3a0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
1f3b0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
1f3c0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
1f3d0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
1f3e0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
1f3f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1f400 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
1f410 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
1f420 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
1f430 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
1f440 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
1f450 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
1f460 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
1f470 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
1f480 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
1f490 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
1f4a0 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
1f4b0 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
1f4c0 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
1f4d0 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
1f4e0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
1f4f0 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
1f500 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
1f510 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
1f520 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
1f530 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
1f540 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
1f550 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
1f560 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
1f570 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
1f580 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f590 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
1f5a0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
1f5b0 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
1f5c0 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
1f5d0 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
1f5e0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
1f5f0 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46  balance */../* F
1f600 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1f610 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62   */.static int b
1f620 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c  alance(MemPage*,
1f630 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20   int);..#ifndef 
1f640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
1f650 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
1f660 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
1f670 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
1f680 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
1f690 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
1f6a0 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
1f6b0 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
1f6c0 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
1f6d0 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
1f6e0 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
1f6f0 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
1f700 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
1f710 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
1f720 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
1f730 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
1f740 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
1f750 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
1f760 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
1f770 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
1f780 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
1f790 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
1f7a0 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
1f7b0 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
1f7c0 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
1f7d0 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
1f7e0 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
1f7f0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
1f800 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
1f810 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
1f820 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
1f830 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
1f840 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
1f850 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
1f860 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
1f870 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
1f880 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
1f890 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
1f8a0 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
1f8b0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
1f8c0 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
1f8d0 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
1f8e0 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
1f8f0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
1f900 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
1f910 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
1f920 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
1f930 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
1f940 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
1f950 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
1f960 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
1f970 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
1f980 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67  e *pPage, MemPag
1f990 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69  e *pParent){.  i
1f9a0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
1f9b0 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70   *pNew;.  Pgno p
1f9c0 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43  gnoNew;.  u8 *pC
1f9d0 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c  ell;.  int szCel
1f9e0 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  l;.  CellInfo in
1f9f0 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  fo;.  BtShared *
1fa00 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1fa10 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64  ;.  int parentId
1fa20 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  x = pParent->nCe
1fa30 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74  ll;   /* pParent
1fa40 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
1fa50 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
1fa60 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20   parentSize;    
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa80 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69  * Size of new di
1fa90 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
1faa0 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34  u8 parentCell[64
1fab0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
1fac0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74    /* Space for t
1fad0 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
1fae0 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ell */..  /* All
1faf0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1fb00 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65  . Insert the ove
1fb10 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
1fb20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20  pPage.  ** into 
1fb30 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20  it. Then remove 
1fb40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
1fb50 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20  l from pPage..  
1fb60 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
1fb70 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1fb80 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
1fb90 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
1fba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fbb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fbc0 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61   }.  pCell = pPa
1fbd0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
1fbe0 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63  ll;.  szCell = c
1fbf0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
1fc00 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f  , pCell);.  zero
1fc10 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65  Page(pNew, pPage
1fc20 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61  ->aData[0]);.  a
1fc30 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
1fc40 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
1fc50 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
1fc60 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
1fc70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72    /* Set the par
1fc80 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79  ent of the newly
1fc90 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
1fca0 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
1fcb0 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d   pNew->pParent =
1fcc0 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69   pParent;.  sqli
1fcd0 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
1fce0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a  ent->pDbPage);..
1fcf0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75    /* pPage is cu
1fd00 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68  rrently the righ
1fd10 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t-child of pPare
1fd20 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a  nt. Change this.
1fd30 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65    ** so that the
1fd40 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20   right-child is 
1fd50 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c  the new page all
1fd60 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64  ocated above and
1fd70 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74  .  ** pPage is t
1fd80 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74  he next-to-right
1fd90 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20   child. .  */.  
1fda0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
1fdb0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 43 65 6c  Cell>0 );.  pCel
1fdc0 6c 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  l = sqlite3Btree
1fdd0 46 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  FindCell(pPage, 
1fde0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
1fdf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
1fe00 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
1fe10 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1fe20 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
1fe30 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
1fe40 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  entCell, 0, info
1fe50 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
1fe60 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  &parentSize);.  
1fe70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fe80 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1fe90 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
1fea0 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20  ( parentSize<64 
1feb0 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74  );.  rc = insert
1fec0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61  Cell(pParent, pa
1fed0 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43  rentIdx, parentC
1fee0 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c  ell, parentSize,
1fef0 20 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72 63   0, 4);.  if( rc
1ff00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ff10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ff20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 66 69 6e  }.  put4byte(fin
1ff30 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
1ff40 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29  arent,parentIdx)
1ff50 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1ff60 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
1ff70 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
1ff80 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
1ff90 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66  , pgnoNew);..#if
1ffa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ffb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1ffc0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
1ffd0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1ffe0 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
1fff0 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a  pointer map.  **
20000 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
20010 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
20020 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
20030 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63  from the .  ** c
20040 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
20050 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
20060 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
20070 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20080 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ){.    rc = ptrm
20090 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
200a0 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
200b0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
200c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
200d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
200e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
200f0 7d 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  }.    rc = ptrma
20100 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30  pPutOvfl(pNew, 0
20110 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20140 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
20150 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
20160 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
20170 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62 61   new page and ba
20180 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
20190 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63   page,.  ** in c
201a0 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72 20  ase the divider 
201b0 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61  cell inserted ca
201c0 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d  used it to becom
201d0 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f  e overfull..  */
201e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
201f0 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  New);.  return b
20200 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20  alance(pParent, 
20210 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
20220 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
20230 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  KBALANCE */../*.
20240 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20250 72 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65  redistributes Ce
20260 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64  lls on pPage and
20270 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c   up to NN*2 sibl
20280 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65  ings.** of pPage
20290 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
202a0 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
202b0 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66  e same amount of
202c0 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20   free space..** 
202d0 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69  Usually NN sibli
202e0 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ngs on either si
202f0 64 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75  de of pPage is u
20300 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
20310 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  cing,.** though 
20320 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69  more siblings mi
20330 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
20340 65 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20  e side if pPage 
20350 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
20360 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
20370 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66   its parent.  If
20380 20 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72   pPage has fewer
20390 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69   than 2*NN sibli
203a0 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e  ngs.** (somethin
203b0 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
203c0 20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65   happen if pPage
203d0 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
203e0 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64  e or a .** child
203f0 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61   of root) then a
20400 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62  ll available sib
20410 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74  lings participat
20420 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
20430 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
20440 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
20450 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20   of pPage might 
20460 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
20470 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
20480 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e   or.** two in an
20490 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
204a0 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c  pages nearly ful
204b0 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66  l but not over f
204c0 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61  ull. The root pa
204d0 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c  ge.** is special
204e0 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20   and is allowed 
204f0 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  to be nearly emp
20500 74 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20  ty. If pPage is 
20510 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
20520 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74  e, then the dept
20530 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69  h of the tree mi
20540 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
20550 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64  .** or decreased
20560 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65   by one, as nece
20570 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74  ssary, to keep t
20580 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f  he root page fro
20590 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  m being.** overf
205a0 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c  ull or completel
205b0 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e  y empty..**.** N
205c0 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
205d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
205e0 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68  lled, some of th
205f0 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e Cells on pPage
20600 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  .** might not ac
20610 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64  tually be stored
20620 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
20630 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  [].  This can ha
20640 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70  ppen.** if the p
20650 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  age is overfull.
20660 20 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f    Part of the jo
20670 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
20680 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  e is to.** make 
20690 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66  sure all Cells f
206a0 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67  or pPage once ag
206b0 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65  ain fit in pPage
206c0 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a  ->aData[]..**.**
206d0 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
206e0 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
206f0 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
20700 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  e, the parent of
20710 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
20720 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
20730 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49  or underfull.  I
20740 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  f that happens, 
20750 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
20760 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72  e.** is called r
20770 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68  ecursively on th
20780 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  e parent..**.** 
20790 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
207a0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
207b0 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
207c0 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
207d0 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
207e0 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69  ted state.  So i
207f0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
20800 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61  ails, the databa
20810 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  se should.** be 
20820 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
20830 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
20840 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61  ce_nonroot(MemPa
20850 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
20860 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
20870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20880 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
20890 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
208a0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
208b0 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
208c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
208d0 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
208e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
208f0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
20900 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
20910 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
20920 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
20930 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
20940 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
20950 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
20960 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  t nOld;         
20970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20980 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20990 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
209a0 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
209b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
209c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
209d0 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
209e0 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20  t nDiv;         
209f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20a00 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
20a10 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e   apDiv[] */.  in
20a20 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
20a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20a40 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
20a50 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a70 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20   Index of pPage 
20a80 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
20a90 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  l[] */.  int nxD
20aa0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
20ab0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
20ac0 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
20ad0 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
20ae0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
20b10 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  ode */.  int lea
20b20 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
20b30 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
20b40 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
20b50 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
20b60 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
20b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20b80 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
20b90 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
20ba0 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
20bb0 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
20bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
20bd0 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
20be0 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
20bf0 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
20c00 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
20c10 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
20c20 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
20c30 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c50 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
20c60 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
20c70 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
20c80 74 20 69 53 70 61 63 65 20 3d 20 30 3b 20 20 20  t iSpace = 0;   
20c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20ca0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
20cb0 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20  of aSpace[] */. 
20cc0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
20cd0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
20ce0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
20cf0 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
20d00 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b  .  Pgno pgnoOld[
20d10 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
20d20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
20d30 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
20d40 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65   apOld[] */.  Me
20d50 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
20d60 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
20d70 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
20d80 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
20d90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
20da0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
20db0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
20dc0 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
20dd0 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
20de0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
20df0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
20e00 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
20e10 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
20e20 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75  n apNew[] */.  u
20e30 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20  8 *apDiv[NB];   
20e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
20e50 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20  ivider cells in 
20e60 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  pParent */.  int
20e70 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   cntNew[NB+2];  
20e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20e90 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66  ex in aCell[] of
20ea0 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68   cell after i-th
20eb0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73   page */.  int s
20ec0 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  zNew[NB+2];     
20ed0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69          /* Combi
20ee0 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  ned size of cell
20ef0 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20  s place on i-th 
20f00 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
20f10 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  pCell = 0;      
20f20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
20f30 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
20f40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43  ed */.  int *szC
20f50 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
20f60 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
20f70 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
20f80 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
20f90 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20   u8 *aCopy[NB]; 
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fb0 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69   Space for holdi
20fc0 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70  ng data of apCop
20fd0 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  y[] */.  u8 *aSp
20fe0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
20ff0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
21000 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66  o hold copies of
21010 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
21020 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
21030 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
21040 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20  M.  u8 *aFrom = 
21050 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  0;.#endif..  /* 
21060 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70  .  ** Find the p
21070 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f  arent page..  */
21080 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21090 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
210a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
210b0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
210c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
210d0 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
210e0 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d  pBt;.  pParent =
210f0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
21100 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
21110 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  nt );.  if( SQLI
21120 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
21130 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
21140 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
21150 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
21160 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28  rc;.  }.  TRACE(
21170 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
21180 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
21190 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
211a0 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
211b0 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  gno));..#ifndef 
211c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
211d0 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20  KBALANCE.  /*.  
211e0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73  ** A special cas
211f0 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74  e:  If a new ent
21200 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ry has just been
21210 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
21220 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61  .  ** table (tha
21230 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69  t is, a btree wi
21240 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  th integer keys 
21250 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20  and all data at 
21260 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a  the leaves).  **
21270 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74   and the new ent
21280 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ry is the right-
21290 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  most entry in th
212a0 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74  e tree (it has t
212b0 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  he.  ** largest 
212c0 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68  key) then use th
212d0 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63  e special balanc
212e0 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e  e_quick() routin
212f0 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e  e for.  ** balan
21300 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71  cing.  balance_q
21310 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66  uick() is much f
21320 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74  aster and result
21330 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20  s in a tighter. 
21340 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64   ** packing of d
21350 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ata in the commo
21360 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  n case..  */.  i
21370 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26  f( pPage->leaf &
21380 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  &.      pPage->i
21390 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70  ntKey &&.      p
213a0 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
213b0 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  &.      pPage->n
213c0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20  Overflow==1 &&. 
213d0 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66       pPage->aOvf
213e0 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
213f0 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20  >nCell &&.      
21400 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e  pPage->pParent->
21410 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20  pgno!=1 &&.     
21420 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
21430 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
21440 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
21450 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20  ==pPage->pgno.  
21460 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
21470 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65   TODO: Check the
21480 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65   siblings to the
21490 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20   left of pPage. 
214a0 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20  It may be that. 
214b0 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e     ** they are n
214c0 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e  ot full and no n
214d0 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75 69  ew page is requi
214e0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
214f0 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71  return balance_q
21500 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72  uick(pPage, pPar
21510 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ent);.  }.#endif
21520 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
21530 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65   the cell in the
21540 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f   parent page who
21550 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f  se left child po
21560 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74  ints back.  ** t
21570 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69  o pPage.  The "i
21580 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20  dx" variable is 
21590 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
215a0 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67  t cell.  If pPag
215b0 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69  e.  ** is the ri
215c0 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ghtmost child of
215d0 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65   pParent then se
215e0 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74  t idx to pParent
215f0 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20  ->nCell .  */.  
21600 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78  if( pParent->idx
21610 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e  Shift ){.    Pgn
21620 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f  o pgno;.    pgno
21630 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
21640 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
21650 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
21660 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
21670 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
21680 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70  for(idx=0; idx<p
21690 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69  Parent->nCell; i
216a0 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  dx++){.      if(
216b0 20 67 65 74 34 62 79 74 65 28 73 71 6c 69 74 65   get4byte(sqlite
216c0 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70  3BtreeFindCell(p
216d0 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70  Parent, idx))==p
216e0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 62  gno ){.        b
216f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21700 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21710 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
21720 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ll.             
21730 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  || get4byte(&pPa
21740 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
21750 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
21760 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65  ])==pgno );.  }e
21770 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20 70  lse{.    idx = p
21780 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
21790 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
217a0 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69 61  Initialize varia
217b0 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74 20  bles so that it 
217c0 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f 20  will be safe to 
217d0 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63 74  jump.  ** direct
217e0 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c  ly to balance_cl
217f0 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d  eanup at any mom
21800 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64  ent..  */.  nOld
21810 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73   = nNew = 0;.  s
21820 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
21830 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
21840 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
21850 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  d sibling pages 
21860 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65  to pPage and the
21870 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
21880 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20  t that divide.  
21890 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  ** the siblings.
218a0 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20    An attempt is 
218b0 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
218c0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
218d0 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20  er.  ** side of 
218e0 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62  pPage.  More sib
218f0 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
21900 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
21910 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20  owever, if.  ** 
21920 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20  pPage there are 
21930 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
21940 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
21950 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50  her side.  If pP
21960 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
21970 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
21980 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
21990 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
219a0 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f   are taken..  */
219b0 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d  .  nxDiv = idx -
219c0 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76   NN;.  if( nxDiv
219d0 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d   + NB > pParent-
219e0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78  >nCell ){.    nx
219f0 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Div = pParent->n
21a00 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20  Cell - NB + 1;. 
21a10 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30   }.  if( nxDiv<0
21a20 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
21a30 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20  0;.  }.  nDiv = 
21a40 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d  0;.  for(i=0, k=
21a50 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b  nxDiv; i<NB; i++
21a60 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , k++){.    if( 
21a70 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  k<pParent->nCell
21a80 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
21a90 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  i] = sqlite3Btre
21aa0 65 46 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  eFindCell(pParen
21ab0 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69  t, k);.      nDi
21ac0 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  v++;.      asser
21ad0 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61  t( !pParent->lea
21ae0 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  f );.      pgnoO
21af0 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65  ld[i] = get4byte
21b00 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
21b10 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61  }else if( k==pPa
21b20 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
21b30 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
21b40 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  = get4byte(&pPar
21b50 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
21b60 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
21b70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21b90 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
21ba0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
21bb0 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64  noOld[i], &apOld
21bc0 5b 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  [i], pParent);. 
21bd0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
21be0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
21bf0 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e  ;.    apOld[i]->
21c00 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20  idxParent = k;. 
21c10 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30     apCopy[i] = 0
21c20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  ;.    assert( i=
21c30 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c  =nOld );.    nOl
21c40 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c  d++;.    nMaxCel
21c50 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
21c60 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
21c70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d  ->nOverflow;.  }
21c80 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
21c90 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
21ca0 20 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74   of 2 in order t
21cb0 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
21cc0 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
21cd0 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
21ce0 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31  = (nMaxCells + 1
21cf0 29 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~1;..  /*.  **
21d00 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
21d10 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
21d20 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43  tures.  */.  apC
21d30 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ell = sqliteMall
21d40 6f 63 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e  ocRaw( .       n
21d50 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
21d60 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d80 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
21d90 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
21da0 65 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 20  eof(int)        
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dc0 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a     /* szCell */.
21dd0 20 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69       + ROUND8(si
21de0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e  zeof(MemPage))*N
21df0 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
21e00 20 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20         /* aCopy 
21e10 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
21e20 61 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20  ageSize*(5+NB)  
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
21e50 61 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49  ace */.     + (I
21e60 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d  SAUTOVACUUM ? nM
21e70 61 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20  axCells : 0)    
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e90 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20   aFrom */.  );. 
21ea0 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
21eb0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21ec0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
21ed0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
21ee0 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
21ef0 3d 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b  = (int*)&apCell[
21f00 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43  nMaxCells];.  aC
21f10 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73  opy[0] = (u8*)&s
21f20 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
21f30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43  ;.  assert( ((aC
21f40 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70  opy[0] - (u8*)ap
21f50 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
21f60 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
21f70 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
21f80 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42  .  for(i=1; i<NB
21f90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70  ; i++){.    aCop
21fa0 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d  y[i] = &aCopy[i-
21fb0 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1][pBt->pageSize
21fc0 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d  +ROUND8(sizeof(M
21fd0 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61  emPage))];.    a
21fe0 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69  ssert( ((aCopy[i
21ff0 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  ] - (u8*)apCell)
22000 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
22010 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
22020 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a  required */.  }.
22030 20 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70    aSpace = &aCop
22040 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  y[NB-1][pBt->pag
22050 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
22060 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
22070 20 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61    assert( ((aSpa
22080 63 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  ce - (u8*)apCell
22090 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
220a0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
220b0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66   required */.#if
220c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
220d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
220e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
220f0 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d  m ){.    aFrom =
22100 20 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e   &aSpace[5*pBt->
22110 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23  pageSize];.  }.#
22120 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20  endif.  .  /*.  
22130 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
22140 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
22150 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73   pPage and its s
22160 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c  iblings into aOl
22170 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  d[]..  ** The re
22180 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
22190 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
221a0 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
221b0 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68  s rather.  ** th
221c0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
221d0 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
221e0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
221f0 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
22200 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
22210 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
22220 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
22230 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
22240 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
22250 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
22260 50 61 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b  Page*)&aCopy[i][
22270 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
22280 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26      p->aData = &
22290 28 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70  ((u8*)p)[-pBt->p
222a0 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65  ageSize];.    me
222b0 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61  mcpy(p->aData, a
222c0 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20  pOld[i]->aData, 
222d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
222e0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
222f0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d  ;.    /* The mem
22300 63 70 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e  cpy() above chan
22310 67 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ges the value of
22320 20 70 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20   p->aData so we 
22330 68 61 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73  have to.    ** s
22340 65 74 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a  et it again. */.
22350 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26      p->aData = &
22360 28 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70  ((u8*)p)[-pBt->p
22370 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20  ageSize];.  }.. 
22380 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
22390 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
223a0 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
223b0 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
223c0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
223d0 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
223e0 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
223f0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
22400 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
22410 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
22420 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61   obtained form a
22430 53 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f  Space[] and remo
22440 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
22450 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
22460 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
22470 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
22480 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
22490 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
224a0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
224b0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
224c0 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
224d0 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
224e0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
224f0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
22500 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d  ** into aSpace[]
22510 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
22520 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
22530 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
22540 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
22550 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
22560 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
22570 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
22580 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
22590 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
225a0 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
225b0 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
225c0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
225d0 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
225e0 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
225f0 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
22600 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
22610 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
22620 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
22630 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
22640 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
22650 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
22660 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
22670 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43   keys..  */.  nC
22680 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43  ell = 0;.  leafC
22690 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67  orrection = pPag
226a0 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  e->leaf*4;.  lea
226b0 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  fData = pPage->l
226c0 65 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65  eafData && pPage
226d0 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d  ->leaf;.  for(i=
226e0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
226f0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
22700 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a  ld = apCopy[i];.
22710 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
22720 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
22730 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
22740 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
22750 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
22760 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
22770 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
22780 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
22790 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
227a0 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
227b0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
227c0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
227d0 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
227e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
227f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
22800 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
22810 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
22820 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20         int a;.  
22830 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
22840 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  l] = i;.        
22850 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d  for(a=0; a<pOld-
22860 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29  >nOverflow; a++)
22870 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
22880 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70  pOld->aOvfl[a].p
22890 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65  Cell==apCell[nCe
228a0 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ll] ){.         
228b0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
228c0 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
228d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
228e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
228f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22900 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
22910 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
22920 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  Old-1 ){.      i
22930 6e 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65  nt sz = cellSize
22940 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
22950 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  iv[i]);.      if
22960 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
22970 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68        /* With th
22980 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c  e LEAFDATA flag,
22990 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68   pParent cells h
229a0 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73  old only INTKEYs
229b0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
229c0 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
229d0 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63  of keys on the c
229e0 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20  hild pages.  We 
229f0 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20  need to remove. 
22a00 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69         ** the di
22a10 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
22a20 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68   pParent, but th
22a30 65 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  e dividers cells
22a40 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20   are not.       
22a50 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43   ** added to apC
22a60 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68  ell[] because th
22a70 65 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ey are duplicate
22a80 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73  s of child cells
22a90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22aa0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
22ab0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
22ac0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22ad0 20 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d          u8 *pTem
22ae0 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
22af0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
22b00 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  ls );.        sz
22b10 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
22b20 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
22b30 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
22b40 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  ];.        iSpac
22b50 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
22b60 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
22b70 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
22b80 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
22b90 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
22ba0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  i], sz);.       
22bb0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
22bc0 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
22bd0 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53  ction;.#ifndef S
22be0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
22bf0 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66  ACUUM.        if
22c00 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
22c10 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  m ){.          a
22c20 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
22c30 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  FF;.        }.#e
22c40 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f  ndif.        dro
22c50 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
22c60 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
22c70 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
22c80 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69   -= leafCorrecti
22c90 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  on;.        asse
22ca0 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65  rt( get4byte(pTe
22cb0 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20  mp)==pgnoOld[i] 
22cc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
22cd0 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
22ce0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22cf0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
22d00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 );.          /
22d10 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
22d20 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
22d30 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
22d40 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
22d50 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
22d60 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
22d70 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
22d80 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
22d90 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
22da0 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66  Data[pOld->hdrOf
22db0 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20  fset+8], 4);.   
22dc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
22de0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
22df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22e00 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
22e10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22e20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
22e30 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
22e40 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
22e50 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
22e60 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
22e70 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
22e80 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
22e90 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
22ea0 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
22eb0 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
22ec0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
22ed0 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
22ee0 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
22ef0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
22f00 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
22f10 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
22f20 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
22f30 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
22f40 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
22f50 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
22f60 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
22f70 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
22f80 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
22f90 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
22fa0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
22fb0 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
22fc0 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
22fd0 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
22fe0 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
22ff0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
23000 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
23010 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
23020 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
23030 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
23040 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
23050 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
23060 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
23070 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
23080 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
23090 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
230a0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
230b0 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
230c0 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
230d0 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
230e0 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
230f0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
23100 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
23110 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
23120 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
23130 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
23140 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
23150 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
23160 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
23170 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
23180 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
23190 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
231a0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
231b0 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
231c0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
231d0 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
231e0 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
231f0 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
23200 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
23210 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
23220 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
23230 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
23240 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
23250 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
23260 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
23270 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
23280 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
23290 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
232a0 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
232b0 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
232c0 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
232d0 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
232e0 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
232f0 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
23300 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
23310 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
23320 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
23330 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
23340 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
23350 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
23360 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
23370 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
23380 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
23390 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
233a0 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
233b0 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
233c0 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
233d0 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
233e0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
233f0 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
23400 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
23410 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
23420 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
23430 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
23440 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
23450 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
23460 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
23470 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
23480 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
23490 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
234a0 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
234b0 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
234c0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
234d0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
234e0 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
234f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
23500 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
23510 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
23520 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
23530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23540 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
23550 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
23560 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
23570 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
23580 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
23590 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
235a0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
235b0 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
235c0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
235d0 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
235e0 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
235f0 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
23600 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
23610 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
23620 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
23630 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
23640 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
23650 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
23660 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
23670 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
23680 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
23690 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
236a0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
236b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
236c0 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
236d0 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
236e0 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
236f0 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
23700 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
23710 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
23720 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65  0) or we are the
23730 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
23740 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
23750 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
23760 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
23770 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
23780 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
23790 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
237a0 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
237b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
237c0 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
237d0 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
237e0 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
237f0 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  ell==0) );..  /*
23800 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
23810 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
23820 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
23830 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
23840 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
23850 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
23860 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65  ageFlags = pPage
23870 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
23880 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
23890 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
238a0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
238b0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
238c0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
238d0 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pOld[i];.      p
238e0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
238f0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
23900 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
23910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23920 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
23930 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
23940 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
23950 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
23960 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
23970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23980 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
23990 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
239a0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
239b0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
239c0 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
239d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
239e0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
239f0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
23a00 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
23a10 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
23a20 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65    }.    zeroPage
23a30 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
23a40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65  );.  }..  /* Fre
23a50 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
23a60 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
23a70 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
23a80 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
23a90 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
23aa0 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
23ab0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
23ac0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
23ad0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
23ae0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
23af0 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
23b00 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
23b10 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
23b20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
23b30 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
23b40 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
23b50 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
23b60 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
23b70 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
23b80 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
23b90 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
23ba0 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
23bb0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
23bc0 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
23bd0 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
23be0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
23bf0 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
23c00 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
23c10 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
23c20 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
23c30 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
23c40 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
23c50 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
23c60 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
23c70 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
23c80 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
23c90 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
23ca0 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
23cb0 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
23cc0 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
23cd0 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
23ce0 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
23cf0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
23d00 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
23d10 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
23d20 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
23d30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
23d40 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
23d50 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
23d60 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
23d70 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
23d80 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
23d90 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
23da0 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
23db0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
23dc0 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
23dd0 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
23de0 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
23df0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
23e00 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
23e10 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
23e20 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
23e30 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
23e40 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
23e50 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
23e60 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
23e70 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
23e80 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
23e90 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
23ea0 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
23eb0 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
23ec0 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
23ed0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
23ee0 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
23ef0 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
23f00 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
23f10 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
23f20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
23f30 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
23f40 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
23f50 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
23f60 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
23f70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
23f80 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
23f90 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
23fa0 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
23fb0 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
23fc0 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
23fd0 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
23fe0 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
23ff0 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
24000 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
24010 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
24020 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
24030 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
24040 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
24050 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
24060 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
24070 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
24080 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
24090 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
240a0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
240b0 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
240c0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
240d0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
240e0 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
240f0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
24100 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
24110 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
24120 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
24130 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
24140 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
24150 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
24160 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
24170 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
24180 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61  oNew[i] );.    a
24190 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
241a0 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
241b0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
241c0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
241d0 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
241e0 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
241f0 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
24200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
24210 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
24220 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
24230 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24240 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
24250 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
24260 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
24270 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
24280 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
24290 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
242a0 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
242b0 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
242c0 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
242d0 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
242e0 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
242f0 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
24300 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
24310 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
24320 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
24330 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
24340 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
24350 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
24360 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
24370 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
24380 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
24390 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
243a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
243b0 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
243c0 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
243d0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
243e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
243f0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
24400 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
24410 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
24420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24430 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
24440 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
24450 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24460 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24470 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a   }.#endif..    j
24480 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
24490 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
244a0 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
244b0 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
244c0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
244d0 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
244e0 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
244f0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
24500 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
24510 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e   */.    if( i<nN
24520 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20  ew-1 && j<nCell 
24530 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
24540 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
24550 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
24560 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
24570 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
24580 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
24590 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
245a0 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
245b0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
245c0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
245d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
245e0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
245f0 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
24600 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   4);.        pTe
24610 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
24620 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
24630 20 29 7b 0a 09 2f 2a 20 49 66 20 74 68 65 20 74   ){../* If the t
24640 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61  ree is a leaf-da
24650 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  ta tree, and the
24660 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65   siblings are le
24670 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a  aves, .        *
24680 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
24690 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  no divider cell 
246a0 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73  in apCell[]. Ins
246b0 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65  tead, the divide
246c0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  r .        ** ce
246d0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ll consists of t
246e0 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66  he integer key f
246f0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  or the right-mos
24700 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20  t cell of .     
24710 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e     ** the siblin
24720 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g-page assembled
24730 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20   above only..   
24740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24750 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
24760 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
24770 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24780 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65  ParseCellPtr(pNe
24790 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69  w, apCell[j], &i
247a0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43  nfo);.        pC
247b0 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69 53  ell = &aSpace[iS
247c0 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 66  pace];.        f
247d0 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
247e0 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  t, pCell, 0, inf
247f0 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c  o.nKey, 0, 0, 0,
24800 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69   &sz);.        i
24810 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
24820 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
24830 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
24840 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
24850 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
24860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24870 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
24880 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
24890 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
248a0 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
248b0 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
248c0 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
248d0 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
248e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
248f0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
24900 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
24910 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29  l, sz, pTemp, 4)
24920 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
24930 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
24940 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
24950 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
24960 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
24970 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
24980 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23  , pNew->pgno);.#
24990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
249a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
249b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
249c0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
249d0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e   database, and n
249e0 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  ot a leaf-data t
249f0 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ree,.      ** th
24a00 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  en update the po
24a10 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61  inter map with a
24a20 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
24a30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
24a40 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
24a50 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74  cell just insert
24a60 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66  ed points to (if
24a70 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
24a80 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
24a90 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65  utoVacuum && !le
24aa0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
24ab0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
24ac0 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
24ad0 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
24ae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
24b00 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
24b10 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
24b20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24b30 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
24b40 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
24b50 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
24b60 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
24b70 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
24b80 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
24b90 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
24ba0 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
24bb0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
24bc0 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
24bd0 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f  a[8], &apCopy[nO
24be0 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ld-1]->aData[8],
24bf0 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   4);.  }.  if( n
24c00 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  xDiv==pParent->n
24c10 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f  Cell+pParent->nO
24c20 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f  verflow ){.    /
24c30 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
24c40 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68  ling is the righ
24c50 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  t-most child of 
24c60 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70  pParent */.    p
24c70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
24c80 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
24c90 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
24ca0 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
24cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
24cc0 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
24cd0 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20  ing is the left 
24ce0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72  child of the fir
24cf0 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72  st entry in pPar
24d00 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  ent.    ** past 
24d10 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64  the right-most d
24d20 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a  ivider entry */.
24d30 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
24d40 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
24d50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70  arent, nxDiv), p
24d60 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
24d70 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
24d80 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65  Reparent childre
24d90 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a  n of all cells..
24da0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
24db0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
24dc0 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
24dd0 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b  hildPages(apNew[
24de0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
24df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
24e00 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
24e10 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65  p;.  }.  rc = re
24e20 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
24e30 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  (pParent);.  if(
24e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24e50 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
24e60 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  eanup;..  /*.  *
24e70 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61  * Balance the pa
24e80 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65  rent page.  Note
24e90 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
24ea0 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d  t page (pPage) m
24eb0 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62  ight.  ** have b
24ec0 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  een added to the
24ed0 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20   freelist so it 
24ee0 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  might no longer 
24ef0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
24f00 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72    ** But the par
24f10 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c  ent page will al
24f20 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69  ways be initiali
24f30 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  zed..  */.  asse
24f40 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
24f50 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 62 61  nit );.  rc = ba
24f60 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30  lance(pParent, 0
24f70 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  );.  .  /*.  ** 
24f80 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
24f90 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
24fa0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
24fb0 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 70 43    sqliteFree(apC
24fc0 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
24fd0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
24fe0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
24ff0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
25000 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
25010 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
25020 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
25030 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
25040 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
25050 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
25060 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25   finished with %
25070 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
25080 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
25090 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
250a0 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c  gno, nOld, nNew,
250b0 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75   nCell));.  retu
250c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
250d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
250e0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72  called for the r
250f0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74  oot page of a bt
25100 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  ree when the roo
25110 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  t.** page contai
25120 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68  ns no cells.  Th
25130 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75  is is an opportu
25140 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65  nity to make the
25150 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77   tree.** shallow
25160 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e  er by one level.
25170 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
25180 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
25190 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
251a0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  {.  MemPage *pCh
251b0 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
251c0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69   /* The only chi
251d0 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65  ld page of pPage
251e0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
251f0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
25200 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
25210 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a  r for pChild */.
25220 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25230 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
25240 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
25250 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
25260 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
25270 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
25280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
25290 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  n BTree structur
252a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c  e */.  int mxCel
252b0 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20  lPerPage;       
252c0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
252d0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70  umber of cells p
252e0 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  er page */.  u8 
252f0 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
25300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
25310 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65   cells from page
25320 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
25330 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c   */.  int *szCel
25340 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
25350 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
25360 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
25370 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25380 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
25390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
253a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
253b0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
253c0 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
253d0 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
253e0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
253f0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6d 78  iteMallocRaw( mx
25400 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a  CellPerPage*(siz
25410 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28  eof(u8*)+sizeof(
25420 69 6e 74 29 29 20 29 3b 0a 20 20 69 66 28 20 61  int)) );.  if( a
25430 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pCell==0 ) retur
25440 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
25450 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a    szCell = (int*
25460 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50  )&apCell[mxCellP
25470 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70  erPage];.  if( p
25480 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25490 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69    /* The table i
254a0 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
254b0 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28  ty */.    TRACE(
254c0 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79  ("BALANCE: empty
254d0 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50   table %d\n", pP
254e0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
254f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
25500 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
25510 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20  pty but has one 
25520 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72  child.  Transfer
25530 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f   the.    ** info
25540 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61  rmation from tha
25550 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f  t one child into
25560 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
25570 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  f it .    ** wil
25580 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64  l fit.  This red
25590 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f  uces the depth o
255a0 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e  f the tree by on
255b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
255c0 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   If the root pag
255d0 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20  e is page 1, it 
255e0 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61  has less space a
255f0 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20  vailable than.  
25600 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28    ** its child (
25610 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62  due to the 100 b
25620 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20  yte header that 
25630 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65  occurs at the be
25640 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  ginning.    ** o
25650 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
25660 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74  le), so it might
25670 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
25680 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  hold all of the 
25690 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
256a0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ion currently co
256b0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63  ntained in the c
256c0 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69  hild.  If this i
256d0 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  s the .    ** ca
256e0 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  se, then do not 
256f0 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e  do the transfer.
25700 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65    Leave page 1 e
25710 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20  mpty except.    
25720 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ** for the right
25730 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  -pointer to the 
25740 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
25750 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f   child page beco
25760 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  mes.    ** the v
25770 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74  irtual root of t
25780 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a  he tree..    */.
25790 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20      pgnoChild = 
257a0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
257b0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
257c0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
257d0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
257e0 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ld>0 );.    asse
257f0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73  rt( pgnoChild<=s
25800 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
25810 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d  ount(pPage->pBt-
25820 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  >pPager) );.    
25830 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25840 65 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e  eGetPage(pPage->
25850 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
25860 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20  &pChild, 0);.   
25870 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
25880 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
25890 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ce;.    if( pPag
258a0 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  e->pgno==1 ){.  
258b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
258c0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43  BtreeInitPage(pC
258d0 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20  hild, pPage);.  
258e0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
258f0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
25900 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73  lance;.      ass
25910 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  ert( pChild->nOv
25920 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20  erflow==0 );.   
25930 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
25940 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20  Free>=100 ){.   
25950 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
25960 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
25970 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
25980 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74  ot page, so do t
25990 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  he.        ** co
259a0 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  py */.        in
259b0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72  t i;.        zer
259c0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
259d0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  ild->aData[0]);.
259e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
259f0 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
25a00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
25a10 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 73 71    apCell[i] = sq
25a20 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64 43 65  lite3BtreeFindCe
25a30 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20  ll(pChild,i);.  
25a40 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69          szCell[i
25a50 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
25a60 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69  pChild, apCell[i
25a70 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
25a80 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61        assemblePa
25a90 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
25aa0 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c  ->nCell, apCell,
25ab0 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20   szCell);.      
25ac0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69    /* Copy the ri
25ad0 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght-pointer of t
25ae0 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20  he child to the 
25af0 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
25b00 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
25b10 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
25b20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a  >hdrOffset+8], .
25b30 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
25b40 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44  byte(&pChild->aD
25b50 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f  ata[pChild->hdrO
25b60 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
25b70 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68      freePage(pCh
25b80 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ild);.        TR
25b90 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
25ba0 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72  hild %d transfer
25bb0 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   to page 1\n", p
25bc0 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
25bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25be0 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
25bf0 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   has more inform
25c00 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
25c10 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e  fit on the root.
25c20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
25c30 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
25c40 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f  balanced.  Do no
25c50 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  thing. */.      
25c60 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
25c70 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c  E: child %d will
25c80 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65   not fit on page
25c90 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
25ca0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gno));.      }. 
25cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25cc0 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44  memcpy(pPage->aD
25cd0 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  ata, pChild->aDa
25ce0 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ta, pPage->pBt->
25cf0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
25d00 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
25d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
25d20 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  e->pParent = 0;.
25d30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25d40 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
25d50 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  pPage, 0);.     
25d60 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
25d70 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
25d80 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
25d90 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
25da0 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65  BALANCE: transfe
25db0 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20  r child %d into 
25dc0 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20  root %d\n",.    
25dd0 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64            pChild
25de0 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70  ->pgno, pPage->p
25df0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
25e00 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68   rc = reparentCh
25e10 69 6c 64 50 61 67 65 73 28 70 50 61 67 65 29 3b  ildPages(pPage);
25e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
25e30 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
25e40 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
25e50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
25e60 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
25e70 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25e80 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
25e90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
25ea0 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20  e->nCell; i++){ 
25eb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
25ec0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67  rmapPutOvfl(pPag
25ed0 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  e, i);.        i
25ee0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
25f00 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
25f10 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20  alance;.        
25f20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
25f30 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
25f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
25f50 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
25f60 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 72 65 6c  balance;.    rel
25f70 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
25f80 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f  ;.  }.end_shallo
25f90 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c  w_balance:.  sql
25fa0 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  iteFree(apCell);
25fb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25fc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ../*.** The root
25fd0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
25fe0 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  l.**.** When thi
25ff0 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74  s happens, Creat
26000 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  e a new child pa
26010 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a  ge and copy the.
26020 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
26030 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65  he root into the
26040 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61   child.  Then ma
26050 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  ke the root.** p
26060 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67  age an empty pag
26070 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c  e with rightChil
26080 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  d pointing to th
26090 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20  e new.** child. 
260a0 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20    Finally, call 
260b0 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c  balance_internal
260c0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68  () on the new ch
260d0 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20  ild.** to cause 
260e0 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a  it to split..*/.
260f0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
26100 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67  ce_deeper(MemPag
26110 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
26120 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
26130 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
26140 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
26150 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
26160 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20   *pChild;    /* 
26170 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  Pointer to a new
26180 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
26190 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
261a0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
261b0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ber of the new c
261c0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42  hild page */.  B
261d0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
261e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
261f0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
26200 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54  leSize;     /* T
26210 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65  otal usable size
26220 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   of a page */.  
26230 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
26240 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
26250 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
26260 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61  e */.  u8 *cdata
26270 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
26280 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69  ntent of the chi
26290 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ld page */.  int
262a0 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
262b0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61   /* Offset to pa
262c0 67 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72  ge header in par
262d0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ent */.  int brk
262e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
262f0 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e  Offset to conten
26300 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  t of first cell 
26310 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20  in parent */..  
26320 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
26330 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
26340 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
26350 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70  verflow>0 );.  p
26360 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
26370 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
26380 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
26390 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69  pChild, &pgnoChi
263a0 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ld, pPage->pgno,
263b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
263c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
263d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
263e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
263f0 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
26400 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
26410 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
26420 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
26430 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
26440 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
26450 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
26460 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
26470 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69  ;.  cdata = pChi
26480 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d  ld->aData;.  mem
26490 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61  cpy(cdata, &data
264a0 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65  [hdr], pPage->ce
264b0 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
264c0 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20  ->nCell-hdr);.  
264d0 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72  memcpy(&cdata[br
264e0 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20  k], &data[brk], 
264f0 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b  usableSize-brk);
26500 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
26510 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  d->isInit==0 );.
26520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
26530 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69  reeInitPage(pChi
26540 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66  ld, pPage);.  if
26550 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
26560 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
26570 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
26580 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f  aOvfl, pPage->aO
26590 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  vfl, pPage->nOve
265a0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61  rflow*sizeof(pPa
265b0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ge->aOvfl[0]));.
265c0 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
265d0 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76  low = pPage->nOv
265e0 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43  erflow;.  if( pC
265f0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
26600 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e  ){.    pChild->n
26610 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
26620 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
26630 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43  nCell==pPage->nC
26640 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ell );.  zeroPag
26650 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
26660 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
26670 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
26680 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
26690 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
266a0 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
266b0 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
266c0 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
266d0 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50  d into %d\n", pP
266e0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  age->pgno, pChil
266f0 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64  d->pgno));.#ifnd
26700 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26710 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
26720 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26730 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
26740 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
26750 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67  (pBt, pChild->pg
26760 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
26770 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
26780 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
26790 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
267a0 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  out;.    for(i=0
267b0 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
267c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  l; i++){.      r
267d0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
267e0 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20  l(pChild, i);.  
267f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26810 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26820 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
26830 6e 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61  ndif.  rc = bala
26840 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69  nce_nonroot(pChi
26850 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65  ld);..balancedee
26860 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61  per_out:.  relea
26870 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
26880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26890 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20  /*.** Decide if 
268a0 74 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e  the page pPage n
268b0 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
268c0 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69  ced.  If balanci
268d0 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65  ng is.** require
268e0 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72  d, call the appr
268f0 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
26900 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  g routine..*/.st
26910 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
26920 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
26930 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20   int insert){.  
26940 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26950 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  OK;.  if( pPage-
26960 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20  >pParent==0 ){. 
26970 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
26980 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
26990 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
269a0 64 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20  deeper(pPage);. 
269b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
269c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
269d0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
269e0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
269f0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50  nce_shallower(pP
26a00 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  age);.    }.  }e
26a10 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
26a20 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
26a30 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e  || .        (!in
26a40 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
26a50 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
26a60 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
26a70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
26a80 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
26a90 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
26aa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26ab0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
26ac0 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ine checks all c
26ad0 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e  ursors that poin
26ae0 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52  t to table pgnoR
26af0 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  oot..** If any o
26b00 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20  f those cursors 
26b10 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
26b20 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20   wrFlag==0 in a 
26b30 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74  different.** dat
26b40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
26b50 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e   (a database con
26b60 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61  nection that sha
26b70 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  res the pager.**
26b80 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20   cache with the 
26b90 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
26ba0 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68  on) and that oth
26bb0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  er connection .*
26bc0 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  * is not in the 
26bd0 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64  ReadUncommmitted
26be0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69   state, then thi
26bf0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
26c00 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  s .** SQLITE_LOC
26c10 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64  KED..**.** In ad
26c20 64 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69  dition to checki
26c30 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b  ng for read-lock
26c40 73 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d  s (where a read-
26c50 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61  lock .** means a
26c60 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77   cursor opened w
26c70 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74  ith wrFlag==0) t
26c80 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
26c90 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72   moves.** all wr
26ca0 69 74 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74  ite cursors so t
26cb0 68 61 74 20 74 68 65 79 20 61 72 65 20 70 6f 69  hat they are poi
26cc0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a  nting to the .**
26cd0 20 66 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74   first Cell on t
26ce0 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54  he root page.  T
26cf0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
26d00 20 62 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65   because an inse
26d10 72 74 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65  rt .** or delete
26d20 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
26d30 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
26d40 73 20 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64  s on a page or d
26d50 65 6c 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20  elete.** a page 
26d60 65 6e 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20  entirely and we 
26d70 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c  do not want to l
26d80 65 61 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73  eave any cursors
26d90 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f   .** pointing to
26da0 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61   non-existant pa
26db0 67 65 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f  ges or cells..*/
26dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
26dd0 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65  kReadLocks(Btree
26de0 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70   *pBtree, Pgno p
26df0 67 6e 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  gnoRoot, BtCurso
26e00 72 20 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20  r *pExclude){.  
26e10 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
26e20 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
26e30 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71  Btree->pBt;.  sq
26e40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72  lite3 *db = pBtr
26e50 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 66  ee->pSqlite;.  f
26e60 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
26e70 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
26e80 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45  ){.    if( p==pE
26e90 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75  xclude ) continu
26ea0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53  e;.    if( p->eS
26eb0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
26ec0 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ID ) continue;. 
26ed0 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
26ee0 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63  ot!=pgnoRoot ) c
26ef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
26f00 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 7b   p->wrFlag==0 ){
26f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
26f20 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74  dbOther = p->pBt
26f30 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20  ree->pSqlite;.  
26f40 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d      if( dbOther=
26f50 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28  =0 ||.         (
26f60 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28  dbOther!=db && (
26f70 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26  dbOther->flags &
26f80 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
26f90 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a  mmitted)==0) ){.
26fa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
26fb0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
26fc0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
26fd0 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67  if( p->pPage->pg
26fe0 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20  no!=p->pgnoRoot 
26ff0 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52  ){.      moveToR
27000 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  oot(p);.    }.  
27010 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
27020 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
27030 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
27040 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
27050 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
27060 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
27070 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
27080 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
27090 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
270a0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
270b0 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
270c0 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
270d0 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
270e0 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
270f0 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
27100 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
27110 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
27120 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
27130 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
27140 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
27150 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
27160 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
27170 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
27180 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
27190 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
271a0 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
271b0 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
271c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
271d0 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
271e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
271f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27200 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
27210 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
27220 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
27230 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
27240 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
27250 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
27260 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
27270 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
27280 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
27290 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
272a0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
272b0 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
272d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
272e0 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
272f0 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
27300 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20   int appendBias 
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
27330 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
27340 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
27350 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
27360 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65   int szNew;.  Me
27370 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
27380 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
27390 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
273a0 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
273b0 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
273c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
273d0 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66  wCell = 0;..  if
273e0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
273f0 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
27400 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
27410 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
27420 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
27430 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  g an insert */. 
27440 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
27450 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
27460 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
27470 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
27480 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
27490 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
274a0 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
274b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
274c0 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75  TE_PERM;   /* Cu
274d0 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f  rsor not open fo
274e0 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
274f0 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
27500 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72  Locks(pCur->pBtr
27510 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ee, pCur->pgnoRo
27520 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20  ot, pCur) ){.   
27530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
27540 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
27550 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
27560 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
27570 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ck */.  }..  /* 
27580 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
27590 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
275a0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
275b0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
275c0 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
275d0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
275e0 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21   .    SQLITE_OK!
275f0 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
27600 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
27610 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
27620 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f  ) ||.    SQLITE_
27630 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
27640 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75  3BtreeMoveto(pCu
27650 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61  r, pKey, nKey, a
27660 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29  ppendBias, &loc)
27670 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
27680 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  n rc;.  }..  pPa
27690 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
276a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
276b0 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
276c0 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
276d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
276e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74   !pPage->leafDat
276f0 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49  a );.  TRACE(("I
27700 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20  NSERT: table=%d 
27710 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d  nkey=%lld ndata=
27720 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22  %d page=%d %s\n"
27730 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ,.          pCur
27740 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79  ->pgnoRoot, nKey
27750 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  , nData, pPage->
27760 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
27770 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72  loc==0 ? "overwr
27780 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72  ite" : "new entr
27790 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y"));.  assert( 
277a0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
277b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
277c0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
277d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
277e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
277f0 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c  .  newCell = sql
27800 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58  iteMallocRaw( MX
27810 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
27820 29 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  );.  if( newCell
27830 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
27840 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
27850 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
27860 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
27870 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
27880 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
27890 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
278a0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
278b0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
278c0 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
278d0 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
278e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
278f0 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
27900 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c  (pBt) );.  if( l
27910 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
27920 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
27930 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ate ){.    int s
27940 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
27950 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
27960 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
27970 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
27980 6f 6c 64 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65  oldCell = sqlite
27990 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 70  3BtreeFindCell(p
279a0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
279b0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
279c0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
279d0 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
279e0 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
279f0 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
27a00 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
27a10 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
27a20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
27a30 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
27a40 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
27a50 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
27a60 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
27a70 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f  , pCur->idx, szO
27a80 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ld);.  }else if(
27a90 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
27aa0 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
27ab0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
27ac0 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  eaf );.    pCur-
27ad0 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72  >idx++;.    pCur
27ae0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
27af0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
27b00 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
27b10 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
27b20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
27b30 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65  e, pCur->idx, ne
27b40 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
27b50 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
27b60 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27b70 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63  end_insert;.  rc
27b80 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
27b90 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74  , 1);.  /* sqlit
27ba0 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28  e3BtreePageDump(
27bb0 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75 72 2d  pCur->pBt, pCur-
27bc0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a  >pgnoRoot, 1); *
27bd0 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28 73 74  /.  /* fflush(st
27be0 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66 28 20  dout); */.  if( 
27bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27c00 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
27c10 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69  pCur);.  }.end_i
27c20 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74 65 46  nsert:.  sqliteF
27c30 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20  ree(newCell);.  
27c40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27c50 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  .** Delete the e
27c60 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
27c70 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
27c80 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72   to.  The cursor
27c90 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
27ca0 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
27cb0 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   location..*/.in
27cc0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  t sqlite3BtreeDe
27cd0 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70  lete(BtCursor *p
27ce0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
27cf0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
27d00 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Page;.  unsigned
27d10 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
27d20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
27d30 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
27d40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
27d50 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
27d60 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  t;..  assert( pP
27d70 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
27d80 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
27d90 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
27da0 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
27db0 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
27dc0 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64  saction before d
27dd0 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f  oing a delete */
27de0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
27df0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
27e00 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
27e10 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
27e20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
27e30 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
27e40 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70  ( pCur->idx >= p
27e50 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
27e60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27e70 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20  _ERROR;  /* The 
27e80 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
27e90 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69  inting to anythi
27ea0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
27eb0 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
27ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27ed0 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69  TE_PERM;   /* Di
27ee0 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73 20  d not open this 
27ef0 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74 69  cursor for writi
27f00 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
27f10 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
27f20 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
27f30 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
27f40 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
27f50 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
27f60 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
27f70 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
27f80 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
27f90 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
27fa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
27fb0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20  sor position (a 
27fc0 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72  no-op if the cur
27fd0 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20  sor is not in . 
27fe0 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49   ** CURSOR_REQUI
27ff0 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e  RESEEK state) an
28000 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69 74  d save the posit
28010 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
28020 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20  r cursors .  ** 
28030 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
28040 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c   table. Then cal
28050 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
28060 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67  ite() on the pag
28070 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
28080 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65  entry will be de
28090 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f  leted from..  */
280a0 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20  .  if( .    (rc 
280b0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
280c0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
280d0 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
280e0 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
280f0 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
28100 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
28110 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
28120 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28130 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
28140 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e))!=0.  ){.    
28150 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
28160 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
28170 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 27 73  cell within it's
28180 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20   page and leave 
28190 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74  pCell pointing t
281a0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e  o the.  ** data.
281b0 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29   The clearCell()
281c0 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20   call frees any 
281d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
281e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
281f0 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68  he.  ** cell. Th
28200 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73  e cell itself is
28210 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20   still intact.. 
28220 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 73 71   */.  pCell = sq
28230 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64 43 65  lite3BtreeFindCe
28240 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
28250 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61  idx);.  if( !pPa
28260 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
28270 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
28280 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d  byte(pCell);.  }
28290 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c  .  rc = clearCel
282a0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
282b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
282c0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
282d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
282e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
282f0 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f  entry we are abo
28300 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20  ut to delete is 
28310 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66  not a leaf so if
28320 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   we do not.    *
28330 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  * do something w
28340 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68  e will leave a h
28350 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e  ole on an intern
28360 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20  al page..    ** 
28370 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20  We have to fill 
28380 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69  the hole by movi
28390 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f  ng in a cell fro
283a0 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20  m a leaf.  The. 
283b0 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20     ** next Cell 
283c0 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f  after the one to
283d0 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67   be deleted is g
283e0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
283f0 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f  st and.    ** to
28400 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65   be a leaf so we
28410 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20   can use it..   
28420 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72   */.    BtCursor
28430 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e   leafCur;.    un
28440 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65  signed char *pNe
28450 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e 65  xt;.    int szNe
28460 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  xt;  /* The comp
28470 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69 73 20  iler warning is 
28480 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69 73  wrong: szNext is
28490 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20 20 20   always .       
284a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69            ** ini
284b0 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20  tialized before 
284c0 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61 6e 20  use.  Adding an 
284d0 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61  extra initializa
284e0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tion.           
284f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c 65        ** to sile
28500 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  nce the compiler
28510 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65 20   slows down the 
28520 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  code. */.    int
28530 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
28540 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
28550 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
28560 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c  ssert( !pPage->l
28570 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20 73  eafData );.    s
28580 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
28590 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26  mpCursor(pCur, &
285a0 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63  leafCur);.    rc
285b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
285c0 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e  ext(&leafCur, &n
285d0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
285e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
285f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
28600 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 6c  ite3PagerWrite(l
28610 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 44  eafCur.pPage->pD
28620 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
28630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 52 41  _OK ){.      TRA
28650 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
28660 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74  le=%d delete int
28670 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65  ernal from %d re
28680 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20  place from leaf 
28690 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
286a0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
286b0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61  pPage->pgno, lea
286c0 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f  fCur.pPage->pgno
286d0 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65  ));.      dropCe
286e0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
286f0 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72  idx, cellSizePtr
28700 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b  (pPage, pCell));
28710 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 73  .      pNext = s
28720 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64 43  qlite3BtreeFindC
28730 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
28740 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b  e, leafCur.idx);
28750 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20  .      szNext = 
28760 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66  cellSizePtr(leaf
28770 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74  Cur.pPage, pNext
28780 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28790 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
287a0 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a  t)>=szNext+4 );.
287b0 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d        tempCell =
287c0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
287d0 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
287e0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Bt) );.      if(
287f0 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a   tempCell==0 ){.
28800 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28810 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
28820 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
28830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28840 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  {.      rc = ins
28850 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
28860 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d  Cur->idx, pNext-
28870 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
28880 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pCell, 0);.    }
28890 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
288a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
288b0 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
288c0 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
288d0 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e   pCur->idx), pgn
288e0 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72  oChild);.      r
288f0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
28900 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
28910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70  OK ){.      drop
28930 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61  Cell(leafCur.pPa
28940 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c  ge, leafCur.idx,
28950 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   szNext);.      
28960 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61  rc = balance(lea
28970 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a  fCur.pPage, 0);.
28980 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28990 46 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a  Free(tempCell);.
289a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
289b0 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  ReleaseTempCurso
289c0 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d  r(&leafCur);.  }
289d0 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28  else{.    TRACE(
289e0 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
289f0 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c  %d delete from l
28a00 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
28a10 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
28a20 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
28a30 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
28a40 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
28a50 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
28a60 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
28a70 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
28a80 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ge, 0);.  }.  if
28a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28aa0 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
28ab0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72  t(pCur);.  }.  r
28ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28ad0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
28ae0 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72  BTree table.  Wr
28af0 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c  ite into *piTabl
28b00 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  e the page.** nu
28b10 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f  mber for the roo
28b20 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
28b30 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  w table..**.** T
28b40 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20  he type of type 
28b50 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
28b60 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
28b70 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  eter.  Only the.
28b80 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  ** following val
28b90 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65  ues of flags are
28ba0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
28bb0 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73  e.  Other values
28bc0 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69   for.** flags mi
28bd0 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a  ght not work:.**
28be0 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e  .**     BTREE_IN
28bf0 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44  TKEY|BTREE_LEAFD
28c00 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72  ATA     Used for
28c10 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68   SQL tables with
28c20 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20   rowid keys.**  
28c30 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54     BTREE_ZERODAT
28c40 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A               
28c50 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
28c60 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74 20 73  indices.*/.int s
28c70 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
28c80 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
28c90 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
28ca0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53  nt flags){.  BtS
28cb0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
28cc0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
28cd0 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67  pRoot;.  Pgno pg
28ce0 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  noRoot;.  int rc
28cf0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
28d00 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
28d10 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
28d20 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
28d30 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74  ransaction first
28d40 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
28d50 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
28d60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
28d70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
28d80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
28d90 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
28da0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
28db0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
28dc0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
28dd0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
28de0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
28df0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
28e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73   return rc;.#els
28e10 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  e.  if( pBt->aut
28e20 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
28e30 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20  gno pgnoMove;   
28e40 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67     /* Move a pag
28e50 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72  e here to make r
28e60 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  oom for the root
28e70 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  -page */.    Mem
28e80 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b  Page *pPageMove;
28e90 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
28ea0 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20  move to. */..   
28eb0 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e   /* Creating a n
28ec0 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f  ew table may pro
28ed0 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f  bably require mo
28ee0 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  ving an existing
28ef0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
28f00 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
28f10 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  r the new tables
28f20 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63   root page. In c
28f30 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75  ase this page tu
28f40 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  rns.    ** out t
28f50 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  o be an overflow
28f60 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c   page, delete al
28f70 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  l overflow page-
28f80 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a  map caches.    *
28f90 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63  * held by open c
28fa0 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  ursors..    */. 
28fb0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
28fc0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
28fd0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  t);..    /* Read
28fe0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
28ff0 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64  ta[3] from the d
29000 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72  atabase to deter
29010 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20  mine where the. 
29020 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
29030 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
29040 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61   should go. meta
29050 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65  [3] is the large
29060 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
29070 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66   ** created so f
29080 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72  ar, so the new r
29090 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74  oot-page is (met
290a0 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a  a[3]+1)..    */.
290b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
290c0 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
290d0 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  4, &pgnoRoot);. 
290e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
290f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29100 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b  ;.    pgnoRoot++
29110 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
29120 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20  w root-page may 
29130 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
29140 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   on a pointer-ma
29150 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20  p page, or the. 
29160 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
29170 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  TE page..    */.
29180 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74      if( pgnoRoot
29190 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
291a0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c  pBt, pgnoRoot) |
291b0 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f  |.        pgnoRo
291c0 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ot==PENDING_BYTE
291d0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
291e0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
291f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29200 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b  ( pgnoRoot>=3 );
29210 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
29220 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61  e a page. The pa
29230 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  ge that currentl
29240 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e  y resides at pgn
29250 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a  oRoot will.    *
29260 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  * be moved to th
29270 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
29280 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c   (unless the all
29290 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70  ocated page happ
292a0 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65  ens.    ** to re
292b0 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  side at pgnoRoot
292c0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
292d0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
292e0 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65  Page(pBt, &pPage
292f0 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c  Move, &pgnoMove,
29300 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20   pgnoRoot, 1);. 
29310 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
29330 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
29340 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65      if( pgnoMove
29350 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  !=pgnoRoot ){.  
29360 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20      /* pgnoRoot 
29370 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
29380 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
29390 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
293a0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
293b0 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d  new table (assum
293c0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64  ing an error did
293d0 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74   not occur). But
293e0 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a   we were.      *
293f0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f  * allocated pgno
29400 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65  Move. If require
29410 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61  d (i.e. if it wa
29420 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a  s not allocated.
29430 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65        ** by exte
29440 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c  nding the file),
29450 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
29460 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67  e at position pg
29470 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20  noMove.      ** 
29480 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e  is already journ
29490 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  aled..      */. 
294a0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
294b0 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
294c0 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
294d0 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
294e0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76  );..      /* Mov
294f0 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  e the page curre
29500 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ntly at pgnoRoot
29510 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f   to pgnoMove. */
29520 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29530 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
29540 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
29550 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
29560 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
29580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
29590 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
295a0 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52  apGet(pBt, pgnoR
295b0 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50  oot, &eType, &iP
295c0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  trPage);.      i
295d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
295e0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
295f0 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
29600 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
29610 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
29620 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
29630 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
29640 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29650 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
29660 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
29670 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AGE );.      ass
29680 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
29690 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20  AP_FREEPAGE );. 
296a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
296b0 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
296c0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
296d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
296e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
296f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
29700 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
29710 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29720 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
29730 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f  tePage(pBt, pRoo
29740 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  t, eType, iPtrPa
29750 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20  ge, pgnoMove);. 
29760 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
29770 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20  (pRoot);..      
29780 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61  /* Obtain the pa
29790 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a  ge at pgnoRoot *
297a0 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  /.      if( rc!=
297b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
297c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
297d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
297e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
297f0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
29800 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
29810 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29830 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
29850 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29860 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
29870 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
29880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29890 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
298a0 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
298b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
298c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
298d0 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  e{.      pRoot =
298e0 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20   pPageMove;.    
298f0 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  } ..    /* Updat
29900 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  e the pointer-ma
29910 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20  p and meta-data 
29920 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f  with the new roo
29930 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a  t-page number. *
29940 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  /.    rc = ptrma
29950 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pPut(pBt, pgnoRo
29960 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ot, PTRMAP_ROOTP
29970 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
29980 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
29990 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
299a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
299b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
299c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
299d0 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67  ateMeta(p, 4, pg
299e0 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
299f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
29a00 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
29a10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29a20 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
29a30 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  {.    rc = alloc
29a40 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
29a50 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
29a60 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  oot, 1, 0);.    
29a70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
29a80 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rc;.  }.#endif. 
29a90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29aa0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29ab0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
29ac0 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
29ad0 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54  Root, flags | PT
29ae0 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74  F_LEAF);.  sqlit
29af0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f  e3PagerUnref(pRo
29b00 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
29b10 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29  *piTable = (int)
29b20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75  pgnoRoot;.  retu
29b30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29b40 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65  ./*.** Erase the
29b50 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
29b60 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73  page and all its
29b70 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75   children.  Retu
29b80 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74  rn.** the page t
29b90 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
29ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
29bb0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
29bc0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
29bd0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
29be0 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f  he BTree that co
29bf0 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
29c00 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
29c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29c20 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c  age number to cl
29c30 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ear */.  MemPage
29c40 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f   *pParent,     /
29c50 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20  * Parent page.  
29c60 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f  NULL for the roo
29c70 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50  t */.  int freeP
29c80 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20  ageFlag      /* 
29c90 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20  Deallocate page 
29ca0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
29cb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
29cc0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
29cd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
29ce0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Cell;.  int i;..
29cf0 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74    if( pgno>sqlit
29d00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
29d10 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
29d20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29d30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29d40 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
29d50 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
29d60 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70   pgno, &pPage, p
29d70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
29d80 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
29d90 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
29da0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
29db0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
29dc0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 73 71 6c  .    pCell = sql
29dd0 69 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c  ite3BtreeFindCel
29de0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
29df0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
29e00 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
29e10 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
29e20 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
29e30 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70  pCell), pPage->p
29e40 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
29e50 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29e60 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
29e70 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
29e80 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
29e90 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
29ea0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29eb0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
29ec0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
29ed0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
29ee0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
29ef0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
29f00 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
29f10 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50  e->aData[8]), pP
29f20 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
29f30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
29f40 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
29f50 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
29f60 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61   if( freePageFla
29f70 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  g ){.    rc = fr
29f80 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
29f90 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
29fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29fb0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
29fc0 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65  e))==0 ){.    ze
29fd0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  roPage(pPage, pP
29fe0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20  age->aData[0] | 
29ff0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a  PTF_LEAF);.  }..
2a000 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2a010 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  e_out:.  release
2a020 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
2a030 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a040 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  ** Delete all in
2a050 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
2a060 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
2a070 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2a080 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65  iTable is.** the
2a090 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2a0a0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2a0b0 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68  table.  After th
2a0c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2a0d0 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  ns,.** the root 
2a0e0 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62  page is empty, b
2a0f0 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  ut still exists.
2a100 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a110 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
2a120 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
2a130 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2a140 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63  y open.** read c
2a150 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
2a160 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65  ble.  Open write
2a170 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76   cursors are mov
2a180 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f  ed to the.** roo
2a190 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
2a1a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2a1b0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
2a1c0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2a1d0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
2a1e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2a1f0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
2a200 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2a210 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2a220 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2a230 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2a240 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2a250 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
2a260 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2a270 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
2a280 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2a290 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2a2a0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
2a2b0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73  tion of all curs
2a2c0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
2a2d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
2a2e0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2a2f0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2a300 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
2a310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2a320 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
2a330 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2a340 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2a350 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  able, 0, 0);.}..
2a360 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2a370 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
2a380 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
2a390 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2a3a0 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
2a3b0 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
2a3c0 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
2a3d0 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
2a3e0 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
2a3f0 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
2a400 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
2a410 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
2a420 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2a430 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
2a440 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
2a450 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
2a460 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
2a470 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
2a480 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
2a490 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
2a4a0 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
2a4b0 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
2a4c0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2a4d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2a4e0 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
2a4f0 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
2a500 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a510 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
2a520 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
2a530 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
2a540 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
2a550 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
2a560 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
2a570 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2a580 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
2a590 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
2a5a0 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
2a5b0 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
2a5c0 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2a5d0 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
2a5e0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2a5f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a600 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
2a610 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
2a620 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
2a630 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
2a640 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
2a650 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
2a660 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
2a670 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2a680 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
2a690 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
2a6a0 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
2a6b0 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
2a6c0 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2a6d0 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
2a6e0 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
2a6f0 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
2a700 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
2a710 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
2a720 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
2a730 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dure..*/.int sql
2a740 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2a750 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2a760 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
2a770 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2a780 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2a790 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
2a7a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2a7b0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
2a7c0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2a7d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2a7e0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2a7f0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2a800 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2a810 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
2a820 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
2a830 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2a840 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2a850 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2a860 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2a870 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2a880 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2a890 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2a8a0 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
2a8b0 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
2a8c0 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
2a8d0 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
2a8e0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
2a8f0 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
2a900 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
2a910 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
2a920 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
2a930 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2a940 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2a950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2a960 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
2a970 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2a980 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
2a990 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
2a9a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2a9b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
2a9c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
2a9d0 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
2a9e0 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ble);.  if( rc )
2a9f0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2aa00 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2aa10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2aa20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20  *piMoved = 0;.. 
2aa30 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b   if( iTable>1 ){
2aa40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2aa50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2aa60 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2aa70 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c  (pPage);.    rel
2aa80 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2aa90 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
2aaa0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2aab0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78  {.      Pgno max
2aac0 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
2aad0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2aae0 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
2aaf0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
2ab00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ab10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ab20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2ab30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ge);.        ret
2ab40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2ab50 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c  .      if( iTabl
2ab60 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29  e==maxRootPgno )
2ab70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2ab80 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2ab90 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74  dropped is the t
2aba0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61  able with the la
2abb0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2abc0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
2abd0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2abe0 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20  e, put the root 
2abf0 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2ac00 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20   list. .        
2ac10 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2ac20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2ac30 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ac40 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2ac50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ac60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ac70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ac80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ac90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2aca0 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
2acb0 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f   dropped does no
2acc0 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65  t have the large
2acd0 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2ace0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
2acf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2ad00 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  So move the page
2ad10 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20   that does into 
2ad20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
2ad30 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
2ad40 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67  deleted root-pag
2ad50 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
2ad60 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2ad70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65  Move;.        re
2ad80 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2ad90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2ada0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2adb0 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
2adc0 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
2add0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2ade0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2adf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2ae00 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2ae10 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
2ae20 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76  tePage(pBt, pMov
2ae30 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e, PTRMAP_ROOTPA
2ae40 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a  GE, 0, iTable);.
2ae50 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2ae60 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
2ae70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ae80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ae90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2aea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aeb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2aec0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
2aed0 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
2aee0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2aef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2af00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2af10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2af20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2af30 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  freePage(pMove);
2af40 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2af50 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2af60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2af70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2af80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2af90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2afa0 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52   *piMoved = maxR
2afb0 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ootPgno;.      }
2afc0 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
2afd0 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74  he new 'max-root
2afe0 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20  -page' value in 
2aff0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
2b000 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20  der. This.      
2b010 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61  ** is the old va
2b020 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65  lue less one, le
2b030 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74  ss one more if t
2b040 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20  hat happens to. 
2b050 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f       ** be a roo
2b060 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c  t-page number, l
2b070 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66  ess one again if
2b080 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20   that is the.   
2b090 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
2b0a0 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a  TE_PAGE..      *
2b0b0 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50  /.      maxRootP
2b0c0 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  gno--;.      if(
2b0d0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45   maxRootPgno==PE
2b0e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2b0f0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
2b100 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
2b110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b120 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54   maxRootPgno==PT
2b130 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
2b140 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b   maxRootPgno) ){
2b150 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
2b160 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
2b170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
2b180 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49  xRootPgno!=PENDI
2b190 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2b1a0 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) );..      rc =
2b1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2b1c0 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61  ateMeta(p, 4, ma
2b1d0 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
2b1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2b1f0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2b200 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2b210 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2b220 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
2b230 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c  e{.    /* If sql
2b240 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2b250 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e  le was called on
2b260 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20   page 1. */.    
2b270 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2b280 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2b290 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  EAF );.    relea
2b2a0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2b2b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
2b2c0 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   .}.../*.** Read
2b2d0 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   the meta-inform
2b2e0 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64  ation out of a d
2b2f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d  atabase file.  M
2b300 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65  eta[0].** is the
2b310 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
2b320 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
2b330 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2b340 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72    Meta[1].** thr
2b350 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72  ough meta[15] ar
2b360 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  e available for 
2b370 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61  use by higher la
2b380 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  yers.  Meta[0].*
2b390 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  * is read-only, 
2b3a0 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72  the others are r
2b3b0 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a  ead/write..** .*
2b3c0 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79  * The schema lay
2b3d0 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20  er numbers meta 
2b3e0 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74  values different
2b3f0 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65  ly.  At the sche
2b400 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64  ma.** layer (and
2b410 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61   the SetCookie a
2b420 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70  nd ReadCookie op
2b430 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65  codes) the numbe
2b440 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67  r of.** free pag
2b450 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c  es is not visibl
2b460 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d  e.  So Cookie[0]
2b470 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2b480 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20  Meta[1]..*/.int 
2b490 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
2b4a0 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
2b4b0 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74  t idx, u32 *pMet
2b4c0 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  a){.  DbPage *pD
2b4d0 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  bPage;.  int rc;
2b4e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2b4f0 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65   *pP1;.  BtShare
2b500 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b510 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61  ..  /* Reading a
2b520 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
2b530 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64   requires a read
2b540 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20  -lock on page 1 
2b550 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20  (and hence.  ** 
2b560 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2b570 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62  r table. We grab
2b580 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72   this lock regar
2b590 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2b5a0 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65   or.  ** not the
2b5b0 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2b5c0 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
2b5d0 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72  set (the table r
2b5e0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20  ooted at page.  
2b5f0 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20  ** 1 is treated 
2b600 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
2b610 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c  e by queryTableL
2b620 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61  ock() and lockTa
2b630 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ble())..  */.  r
2b640 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
2b650 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  ck(p, 1, READ_LO
2b660 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
2b670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b680 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2b690 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
2b6a0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2b6b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b6c0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
2b6d0 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b  r, 1, &pDbPage);
2b6e0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2b6f0 72 6e 20 72 63 3b 0a 20 20 70 50 31 20 3d 20 28  rn rc;.  pP1 = (
2b700 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
2b710 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
2b720 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
2b730 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74  *pMeta = get4byt
2b740 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
2b750 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  4]);.  sqlite3Pa
2b760 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
2b770 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f  );..  /* If auto
2b780 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61  vacuumed is disa
2b790 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
2b7a0 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72  ld but we are tr
2b7b0 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63  ying to .  ** ac
2b7c0 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75  cess an autovacu
2b7d0 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  umed database, t
2b7e0 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74  hen make the dat
2b7f0 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20  abase readonly. 
2b800 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
2b810 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2b820 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34  UUM.  if( idx==4
2b830 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70   && *pMeta>0 ) p
2b840 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
2b850 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  ;.#endif..  /* G
2b860 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  rab the read-loc
2b870 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  k on page 1. */.
2b880 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
2b890 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
2b8a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b8b0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d  }../*.** Write m
2b8c0 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
2b8d0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
2b8e0 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d  tabase.  Meta[0]
2b8f0 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79   is.** read-only
2b900 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20   and may not be 
2b910 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  written..*/.int 
2b920 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2b930 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  teMeta(Btree *p,
2b940 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d   int idx, u32 iM
2b950 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64  eta){.  BtShared
2b960 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2b970 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2b980 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pP1;.  int rc;.
2b990 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31    assert( idx>=1
2b9a0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2b9b0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2b9c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2b9d0 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2b9e0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2b9f0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2ba00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
2ba10 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
2ba20 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31  age1!=0 );.  pP1
2ba30 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   = pBt->pPage1->
2ba40 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
2ba50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ba60 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
2ba70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2ba80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
2ba90 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  ut4byte(&pP1[36 
2baa0 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29  + idx*4], iMeta)
2bab0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2bac0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2bad0 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
2bae0 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
2baf0 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
2bb00 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2bb10 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
2bb20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
2bb30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2bb40 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
2bb50 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
2bb60 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
2bb70 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2bb80 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
2bb90 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
2bba0 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ** restoreOrClea
2bbb0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2bbc0 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d  ) here..  */.  M
2bbd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2bbe0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72  pCur->pPage;.  r
2bbf0 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50  eturn pPage ? pP
2bc00 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2bc10 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30  ->hdrOffset] : 0
2bc20 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
2bc30 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73  rn the pager ass
2bc40 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42  ociated with a B
2bc50 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Tree.  This rout
2bc60 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ine is used for.
2bc70 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2bc80 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2bc90 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33  /.Pager *sqlite3
2bca0 42 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65  BtreePager(Btree
2bcb0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
2bcc0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d  ->pBt->pPager;.}
2bcd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2bce0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
2bcf0 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65  CHECK./*.** Appe
2bd00 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20  nd a message to 
2bd10 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2bd20 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
2bd30 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70  tic void checkAp
2bd40 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67  pendMsg(.  Integ
2bd50 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a  rityCk *pCheck,.
2bd60 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20    char *zMsg1,. 
2bd70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2bd80 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20  rmat,.  ....){. 
2bd90 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2bda0 68 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66  har *zMsg2;.  if
2bdb0 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  ( !pCheck->mxErr
2bdc0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68   ) return;.  pCh
2bdd0 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20  eck->mxErr--;.  
2bde0 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a  pCheck->nErr++;.
2bdf0 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2be00 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32  Format);.  zMsg2
2be10 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
2be20 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
2be30 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
2be40 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20   if( zMsg1==0 ) 
2be50 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66  zMsg1 = "";.  if
2be60 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  ( pCheck->zErrMs
2be70 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  g ){.    char *z
2be80 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45  Old = pCheck->zE
2be90 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63  rrMsg;.    pChec
2bea0 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  k->zErrMsg = 0;.
2beb0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2bec0 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45  ring(&pCheck->zE
2bed0 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e  rrMsg, zOld, "\n
2bee0 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c  ", zMsg1, zMsg2,
2bef0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2bf00 73 71 6c 69 74 65 46 72 65 65 28 7a 4f 6c 64 29  sqliteFree(zOld)
2bf10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2bf20 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
2bf30 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67  &pCheck->zErrMsg
2bf40 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
2bf50 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20  (char*)0);.  }. 
2bf60 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 73 67   sqliteFree(zMsg
2bf70 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  2);.}.#endif /* 
2bf80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
2bf90 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
2bfa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2bfb0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
2bfc0 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20  ECK./*.** Add 1 
2bfd0 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
2bfe0 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
2bff0 69 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20  iPage.  If this 
2c000 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  is the second.**
2c010 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2c020 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65  e page, add an e
2c030 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
2c040 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e  pCheck->zErrMsg.
2c050 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
2c060 74 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20  there are 2 ore 
2c070 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20  more references 
2c080 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
2c090 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20  0 if.** if this 
2c0a0 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66  is the first ref
2c0b0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
2c0c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63  ge..**.** Also c
2c0d0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2c0e0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20  ge number is in 
2c0f0 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  bounds..*/.stati
2c100 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49  c int checkRef(I
2c110 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
2c120 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63  ck, int iPage, c
2c130 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a  har *zContext){.
2c140 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
2c150 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
2c160 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e   iPage>pCheck->n
2c170 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20  Page || iPage<0 
2c180 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2c190 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2c1a0 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64  ontext, "invalid
2c1b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22   page number %d"
2c1c0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
2c1d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2c1e0 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b  ( pCheck->anRef[
2c1f0 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20  iPage]==1 ){.   
2c200 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2c210 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2c220 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65  , "2nd reference
2c230 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50   to page %d", iP
2c240 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2c250 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2c260 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66    (pCheck->anRef
2c270 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a  [iPage]++)>1;.}.
2c280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c290 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2c2a0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
2c2b0 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
2c2c0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f  e pointer-map fo
2c2d0 72 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61  r page iChild ma
2c2e0 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69  ps to .** page i
2c2f0 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20  Parent, pointer 
2c300 74 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66  type ptrType. If
2c310 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20   not, append an 
2c320 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
2c330 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73   to pCheck..*/.s
2c340 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
2c350 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72  Ptrmap(.  Integr
2c360 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
2c370 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
2c380 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  eck context */. 
2c390 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
2c3a0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
2c3b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2c3c0 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
2c3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
2c3e0 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
2c3f0 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   type */.  Pgno 
2c400 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  iParent,        
2c410 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
2c420 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74  inter map parent
2c430 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2c440 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
2c450 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2c460 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
2c470 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20  (used for error 
2c480 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  msg) */.){.  int
2c490 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61   rc;.  u8 ePtrma
2c4a0 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pType;.  Pgno iP
2c4b0 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20  trmapParent;..  
2c4c0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2c4d0 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69  Check->pBt, iChi
2c4e0 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65  ld, &ePtrmapType
2c4f0 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74  , &iPtrmapParent
2c500 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2c510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68  ITE_OK ){.    ch
2c520 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2c530 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
2c540 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70  Failed to read p
2c550 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69  trmap key=%d", i
2c560 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
2c570 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  rn;.  }..  if( e
2c580 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70  PtrmapType!=eTyp
2c590 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65  e || iPtrmapPare
2c5a0 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20  nt!=iParent ){. 
2c5b0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2c5c0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2c5d0 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20  xt, .      "Bad 
2c5e0 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65  ptr map entry ke
2c5f0 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25  y=%d expected=(%
2c600 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64  d,%d) got=(%d,%d
2c610 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c  )", .      iChil
2c620 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e  d, eType, iParen
2c630 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20  t, ePtrmapType, 
2c640 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
2c650 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
2c660 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e  .** Check the in
2c670 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66  tegrity of the f
2c680 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e  reelist or of an
2c690 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
2c6a0 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74  ist..** Verify t
2c6b0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
2c6c0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c  f pages on the l
2c6d0 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61  ist is N..*/.sta
2c6e0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69  tic void checkLi
2c6f0 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  st(.  IntegrityC
2c700 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49  k *pCheck,  /* I
2c710 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e  ntegrity checkin
2c720 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
2c730 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20  nt isFreeList,  
2c740 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2c750 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61   a freelist.  Fa
2c760 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77  lse for overflow
2c770 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20   page list */.  
2c780 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
2c790 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2c7a0 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70  mber for first p
2c7b0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
2c7c0 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
2c7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2c7e0 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
2c7f0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
2c800 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  st */.  char *zC
2c810 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a  ontext        /*
2c820 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72   Context for err
2c830 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29  or messages */.)
2c840 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
2c850 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20   expected = N;. 
2c860 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50   int iFirst = iP
2c870 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d  age;.  while( N-
2c880 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d  - > 0 && pCheck-
2c890 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62  >mxErr ){.    Db
2c8a0 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b  Page *pOvflPage;
2c8b0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2c8c0 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20  ar *pOvflData;. 
2c8d0 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29     if( iPage<1 )
2c8e0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
2c8f0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
2c900 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
2c910 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65    "%d of %d page
2c920 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f  s missing from o
2c930 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61  verflow list sta
2c940 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20  rting at %d",.  
2c950 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70          N+1, exp
2c960 65 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a  ected, iFirst);.
2c970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c980 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   }.    if( check
2c990 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
2c9a0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62  e, zContext) ) b
2c9b0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
2c9c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43  lite3PagerGet(pC
2c9d0 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50  heck->pPager, (P
2c9e0 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66  gno)iPage, &pOvf
2c9f0 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  lPage) ){.      
2ca00 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
2ca10 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
2ca20 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20   "failed to get 
2ca30 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
2ca40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2ca50 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61     }.    pOvflDa
2ca60 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
2ca70 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
2ca80 65 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50  erGetData(pOvflP
2ca90 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73  age);.    if( is
2caa0 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20  FreeList ){.    
2cab0 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79    int n = get4by
2cac0 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d  te(&pOvflData[4]
2cad0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2cae0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2caf0 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  M.      if( pChe
2cb00 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
2cb10 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
2cb20 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
2cb30 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  k, iPage, PTRMAP
2cb40 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
2cb50 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
2cb60 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2cb70 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d  ( n>pCheck->pBt-
2cb80 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20  >usableSize/4-8 
2cb90 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
2cba0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2cbb0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
2cbc0 20 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74         "freelist
2cbd0 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20   leaf count too 
2cbe0 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c  big on page %d",
2cbf0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
2cc00 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   N--;.      }els
2cc10 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  e{.        for(i
2cc20 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
2cc30 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46           Pgno iF
2cc40 72 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79  reePage = get4by
2cc50 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b  te(&pOvflData[8+
2cc60 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  i*4]);.#ifndef S
2cc70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2cc80 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20  ACUUM.          
2cc90 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
2cca0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2ccb0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2ccc0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
2ccd0 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50  FreePage, PTRMAP
2cce0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
2ccf0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2cd00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2cd10 20 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70        checkRef(p
2cd20 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
2cd30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
2cd40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e       }.        N
2cd50 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   -= n;.      }. 
2cd60 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
2cd70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2cd80 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  UUM.    else{.  
2cd90 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64      /* If this d
2cda0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2cdb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64   auto-vacuum and
2cdc0 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68   iPage is not th
2cdd0 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e last.      ** 
2cde0 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65  page in this ove
2cdf0 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63  rflow list, chec
2ce00 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74  k that the point
2ce10 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
2ce20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  .      ** the fo
2ce30 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74  llowing page mat
2ce40 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20  ches iPage..    
2ce50 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2ce60 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
2ce70 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b  Vacuum && N>0 ){
2ce80 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74  .        i = get
2ce90 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
2cea0 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  ;.        checkP
2ceb0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c  trmap(pCheck, i,
2cec0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
2ced0 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  2, iPage, zConte
2cee0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
2cef0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50   }.#endif.    iP
2cf00 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70  age = get4byte(p
2cf10 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73  OvflData);.    s
2cf20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2cf30 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d  (pOvflPage);.  }
2cf40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2cf50 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
2cf60 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
2cf70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2cf80 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2cf90 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75  ./*.** Do variou
2cfa0 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20  s sanity checks 
2cfb0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
2cfc0 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74   of a tree.  Ret
2cfd0 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  urn.** the tree 
2cfe0 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67  depth.  Root pag
2cff0 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61  es return 0.  Pa
2d000 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61  rents of root pa
2d010 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c  ges.** return 1,
2d020 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   and so forth..*
2d030 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63  * .** These chec
2d040 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a  ks are done:.**.
2d050 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65  **      1.  Make
2d060 20 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73   sure that cells
2d070 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20   and freeblocks 
2d080 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a  do not overlap.*
2d090 2a 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63  *          but c
2d0a0 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65  ombine to comple
2d0b0 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70  tely cover the p
2d0c0 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20  age..**  NO  2. 
2d0d0 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20   Make sure cell 
2d0e0 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65  keys are in orde
2d0f0 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d  r..**  NO  3.  M
2d100 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
2d110 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
2d120 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42  equal to zLowerB
2d130 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e  ound..**  NO  4.
2d140 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b    Make sure no k
2d150 65 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ey is greater th
2d160 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
2d170 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  UpperBound..**  
2d180 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68      5.  Check th
2d190 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f  e integrity of o
2d1a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
2d1b0 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72  *      6.  Recur
2d1c0 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63  sively call chec
2d1d0 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c  kTreePage on all
2d1e0 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20   children..**   
2d1f0 20 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68     7.  Verify th
2d200 61 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  at the depth of 
2d210 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20  all children is 
2d220 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20  the same..**    
2d230 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    8.  Make sure 
2d240 74 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20  this page is at 
2d250 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f  least 33% full o
2d260 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20  r else it is.** 
2d270 20 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f           the roo
2d280 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a  t of the tree..*
2d290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
2d2a0 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e  ckTreePage(.  In
2d2b0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
2d2c0 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66  k,  /* Context f
2d2d0 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  or the sanity ch
2d2e0 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  eck */.  int iPa
2d2f0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
2d300 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
2d310 20 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65   the page to che
2d320 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ck */.  MemPage 
2d330 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
2d340 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   Parent page */.
2d350 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43    char *zParentC
2d360 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e  ontext  /* Paren
2d370 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  t context */.){.
2d380 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d390 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64  ;.  int i, rc, d
2d3a0 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20  epth, d2, pgno, 
2d3b0 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20  cnt;.  int hdr, 
2d3c0 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74  cellStart;.  int
2d3d0 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61   nCell;.  u8 *da
2d3e0 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
2d3f0 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  pBt;.  int usabl
2d400 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43  eSize;.  char zC
2d410 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63  ontext[100];.  c
2d420 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c  har *hit;..  sql
2d430 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2d440 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
2d450 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20  zContext, "Page 
2d460 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a  %d: ", iPage);..
2d470 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2d480 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a  the page exists.
2d490 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68    */.  pBt = pCh
2d4a0 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62  eck->pBt;.  usab
2d4b0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
2d4c0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  ableSize;.  if( 
2d4d0 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
2d4e0 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  n 0;.  if( check
2d4f0 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
2d500 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  e, zParentContex
2d510 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
2d520 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
2d530 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2d540 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  Bt, (Pgno)iPage,
2d550 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20   &pPage, 0))!=0 
2d560 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2d570 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2d580 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22  ontext,.       "
2d590 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68  unable to get th
2d5a0 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f  e page. error co
2d5b0 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de=%d", rc);.   
2d5c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2d5d0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
2d5e0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2d5f0 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29  pPage, pParent))
2d600 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
2d610 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2d620 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
2d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d640 22 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69  "sqlite3BtreeIni
2d650 74 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20  tPage() returns 
2d660 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20  error code %d", 
2d670 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  rc);.    release
2d680 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2d690 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
2d6a0 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61    /* Check out a
2d6b0 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20  ll the cells..  
2d6c0 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a  */.  depth = 0;.
2d6d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2d6e0 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68  ge->nCell && pCh
2d6f0 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29  eck->mxErr; i++)
2d700 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  {.    u8 *pCell;
2d710 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20  .    int sz;.   
2d720 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2d730 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61  .    /* Check pa
2d740 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70  yload overflow p
2d750 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ages.    */.    
2d760 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2d770 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
2d780 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  ), zContext,.   
2d790 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72            "On tr
2d7a0 65 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20  ee page %d cell 
2d7b0 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29  %d: ", iPage, i)
2d7c0 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 73 71  ;.    pCell = sq
2d7d0 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64 43 65  lite3BtreeFindCe
2d7e0 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20  ll(pPage,i);.   
2d7f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
2d800 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2d810 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2d820 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
2d830 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
2d840 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
2d850 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20   += info.nKey;. 
2d860 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69     assert( sz==i
2d870 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
2d880 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e      if( sz>info.
2d890 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
2d8a0 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20  int nPage = (sz 
2d8b0 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
2d8c0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f  usableSize - 5)/
2d8d0 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  (usableSize - 4)
2d8e0 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  ;.      Pgno pgn
2d8f0 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
2d900 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
2d910 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65  erflow]);.#ifnde
2d920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2d930 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
2d940 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2d950 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
2d960 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
2d970 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
2d980 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50  AP_OVERFLOW1, iP
2d990 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
2d9a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2d9b0 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70       checkList(p
2d9c0 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76  Check, 0, pgnoOv
2d9d0 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74  fl, nPage, zCont
2d9e0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
2d9f0 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79   /* Check sanity
2da00 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70   of left child p
2da10 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2da20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2da30 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d   ){.      pgno =
2da40 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
2da50 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2da60 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2da70 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2da80 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2da90 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
2daa0 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
2dab0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
2dac0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
2dad0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2dae0 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54       d2 = checkT
2daf0 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70  reePage(pCheck,p
2db00 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65  gno,pPage,zConte
2db10 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  xt);.      if( i
2db20 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20  >0 && d2!=depth 
2db30 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
2db40 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2db50 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69  , zContext, "Chi
2db60 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69  ld page depth di
2db70 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d  ffers");.      }
2db80 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64  .      depth = d
2db90 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
2dba0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2dbb0 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
2dbc0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2dbd0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2dbe0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73  ffset+8]);.    s
2dbf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2dc00 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
2dc10 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc30 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74    "On page %d at
2dc40 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c   right child: ",
2dc50 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66   iPage);.#ifndef
2dc60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2dc70 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2dc80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2dc90 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74  ){.      checkPt
2dca0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
2dcb0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2dcc0 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20   iPage, 0);.    
2dcd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
2dce0 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
2dcf0 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20  k, pgno, pPage, 
2dd00 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  zContext);.  }. 
2dd10 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
2dd20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67  complete coverag
2dd30 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20  e of the page.  
2dd40 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  */.  data = pPag
2dd50 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
2dd60 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2dd70 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69  et;.  hit = sqli
2dd80 74 65 4d 61 6c 6c 6f 63 28 20 75 73 61 62 6c 65  teMalloc( usable
2dd90 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69  Size );.  if( hi
2dda0 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
2ddb0 68 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65  hit, 1, get2byte
2ddc0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b  (&data[hdr+5]));
2ddd0 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  .    nCell = get
2dde0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2ddf0 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61  3]);.    cellSta
2de00 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  rt = hdr + 12 - 
2de10 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
2de20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2de30 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
2de40 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
2de50 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61  te(&data[cellSta
2de60 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  rt+i*2]);.      
2de70 69 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53  int size = cellS
2de80 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
2de90 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
2dea0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
2deb0 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73   (pc+size-1)>=us
2dec0 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30  ableSize || pc<0
2ded0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
2dee0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2def0 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
2df00 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
2df10 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
2df20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
2df30 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
2df40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2df50 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b  for(j=pc+size-1;
2df60 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74   j>=pc; j--) hit
2df70 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  [j]++;.      }. 
2df80 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74     }.    for(cnt
2df90 3d 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26  =0, i=get2byte(&
2dfa0 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e  data[hdr+1]); i>
2dfb0 30 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a  0 && i<usableSiz
2dfc0 65 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20  e && cnt<10000; 
2dfd0 0a 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b  .           cnt+
2dfe0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  +){.      int si
2dff0 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
2e000 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  ata[i+2]);.     
2e010 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
2e020 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73  ( (i+size-1)>=us
2e030 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20  ableSize || i<0 
2e040 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
2e050 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2e060 2c 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20  , 0,  .         
2e070 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
2e080 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
2e090 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
2e0a0 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
2e0b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e0c0 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20  for(j=i+size-1; 
2e0d0 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  j>=i; j--) hit[j
2e0e0 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
2e0f0 20 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28     i = get2byte(
2e100 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d  &data[i]);.    }
2e110 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30  .    for(i=cnt=0
2e120 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20  ; i<usableSize; 
2e130 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2e140 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  hit[i]==0 ){.   
2e150 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
2e160 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b    }else if( hit[
2e170 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  i]>1 ){.        
2e180 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
2e190 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20  Check, 0,.      
2e1a0 20 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73      "Multiple us
2e1b0 65 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f  es for byte %d o
2e1c0 66 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69  f page %d", i, i
2e1d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Page);.        b
2e1e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2e1f0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
2e200 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a  =data[hdr+7] ){.
2e210 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
2e220 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
2e230 0a 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67  .          "Frag
2e240 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20  mented space is 
2e250 25 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64  %d byte reported
2e260 20 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25   as %d on page %
2e270 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e  d",.          cn
2e280 74 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20  t, data[hdr+7], 
2e290 69 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iPage);.    }.  
2e2a0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 68  }.  sqliteFree(h
2e2b0 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50  it);..  releaseP
2e2c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2e2d0 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a  turn depth+1;.}.
2e2e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e2f0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
2e300 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
2e310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2e320 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
2e330 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e340 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65   does a complete
2e350 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69   check of the gi
2e360 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20  ven BTree file. 
2e370 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61   aRoot[] is.** a
2e380 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73  n array of pages
2e390 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61   numbers were ea
2e3a0 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ch page number i
2e3b0 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
2e3c0 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20  of.** a table.  
2e3d0 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d  nRoot is the num
2e3e0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2e3f0 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  n aRoot..**.** I
2e400 66 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65  f everything che
2e410 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f  cks out, this ro
2e420 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
2e430 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e  LL.  If somethin
2e440 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61  g is.** amiss, a
2e450 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2e460 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2e470 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
2e480 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  from malloc().**
2e490 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
2e4a0 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73  o that error mes
2e4b0 73 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  sage is returned
2e4c0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
2e4d0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
2e4e0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72  sponsible for fr
2e4f0 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  eeing the error 
2e500 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20  message when it 
2e510 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72  is done..*/.char
2e520 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e   *sqlite3BtreeIn
2e530 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20  tegrityCheck(.  
2e540 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a  Btree *p,     /*
2e550 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   The btree to be
2e560 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   checked */.  in
2e570 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41  t *aRoot,   /* A
2e580 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20  n array of root 
2e590 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f  pages numbers fo
2e5a0 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65  r individual tre
2e5b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f  es */.  int nRoo
2e5c0 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  t,    /* Number 
2e5d0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
2e5e0 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d  oot[] */.  int m
2e5f0 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70  xErr,    /* Stop
2e600 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72   reporting error
2e610 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e  s after this man
2e620 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72  y */.  int *pnEr
2e630 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75  r    /* Write nu
2e640 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
2e650 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69  een to this vari
2e660 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
2e670 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a   i;.  int nRef;.
2e680 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43    IntegrityCk sC
2e690 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64  heck;.  BtShared
2e6a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2e6b0 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  .  nRef = sqlite
2e6c0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
2e6d0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
2e6e0 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  f( lockBtreeWith
2e6f0 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45  Retry(p)!=SQLITE
2e700 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
2e710 6e 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 22  n sqliteStrDup("
2e720 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72  Unable to acquir
2e730 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  e a read lock on
2e740 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29 3b   the database");
2e750 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42  .  }.  sCheck.pB
2e760 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63  t = pBt;.  sChec
2e770 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e  k.pPager = pBt->
2e780 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b  pPager;.  sCheck
2e790 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  .nPage = sqlite3
2e7a0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 73  PagerPagecount(s
2e7b0 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20  Check.pPager);. 
2e7c0 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20   sCheck.mxErr = 
2e7d0 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e  mxErr;.  sCheck.
2e7e0 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e 45  nErr = 0;.  *pnE
2e7f0 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rr = 0;.#ifndef 
2e800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2e810 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
2e820 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ->nTrunc!=0 ){. 
2e830 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20     sCheck.nPage 
2e840 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
2e850 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2e860 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20  sCheck.nPage==0 
2e870 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
2e880 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
2e890 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2e8a0 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65   }.  sCheck.anRe
2e8b0 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  f = sqliteMalloc
2e8c0 52 61 77 28 20 28 73 43 68 65 63 6b 2e 6e 50 61  Raw( (sCheck.nPa
2e8d0 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68  ge+1)*sizeof(sCh
2e8e0 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b  eck.anRef[0]) );
2e8f0 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61  .  if( !sCheck.a
2e900 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  nRef ){.    unlo
2e910 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
2e920 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72  pBt);.    *pnErr
2e930 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
2e940 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2e950 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f  "Unable to mallo
2e960 63 20 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20  c %d bytes", .  
2e970 20 20 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50        (sCheck.nP
2e980 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43  age+1)*sizeof(sC
2e990 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b  heck.anRef[0]));
2e9a0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2e9b0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b  i<=sCheck.nPage;
2e9c0 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e   i++){ sCheck.an
2e9d0 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20  Ref[i] = 0; }.  
2e9e0 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  i = PENDING_BYTE
2e9f0 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66  _PAGE(pBt);.  if
2ea00 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ( i<=sCheck.nPag
2ea10 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e  e ){.    sCheck.
2ea20 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20  anRef[i] = 1;.  
2ea30 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d  }.  sCheck.zErrM
2ea40 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68  sg = 0;..  /* Ch
2ea50 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
2ea60 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
2ea70 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69  t.  */.  checkLi
2ea80 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67  st(&sCheck, 1, g
2ea90 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
2eaa0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2eab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65  ,.            ge
2eac0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
2ead0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c  ge1->aData[36]),
2eae0 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a   "Main freelist:
2eaf0 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b   ");..  /* Check
2eb00 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e   all the tables.
2eb10 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
2eb20 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65   i<nRoot && sChe
2eb30 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
2eb40 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d      if( aRoot[i]
2eb50 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2eb60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2eb70 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2eb80 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2eb90 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b  Vacuum && aRoot[
2eba0 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68  i]>1 ){.      ch
2ebb0 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63  eckPtrmap(&sChec
2ebc0 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52  k, aRoot[i], PTR
2ebd0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
2ebe0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
2ebf0 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  f.    checkTreeP
2ec00 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  age(&sCheck, aRo
2ec10 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20  ot[i], 0, "List 
2ec20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22  of tree roots: "
2ec30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
2ec40 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67  e sure every pag
2ec50 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  e in the file is
2ec60 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f   referenced.  */
2ec70 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73  .  for(i=1; i<=s
2ec80 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73  Check.nPage && s
2ec90 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
2eca0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2ecb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2ecc0 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
2ecd0 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20  anRef[i]==0 ){. 
2ece0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
2ecf0 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
2ed00 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65  "Page %d is neve
2ed10 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20  r used", i);.   
2ed20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20   }.#else.    /* 
2ed30 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2ed40 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
2ed50 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20  cuum, make sure 
2ed60 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69  no tables contai
2ed70 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  n.    ** referen
2ed80 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d  ces to pointer-m
2ed90 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f  ap pages..    */
2eda0 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
2edb0 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a  anRef[i]==0 && .
2edc0 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
2edd0 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69  AGENO(pBt, i)!=i
2ede0 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61   || !pBt->autoVa
2edf0 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63  cuum) ){.      c
2ee00 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
2ee10 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20  Check, 0, "Page 
2ee20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  %d is never used
2ee30 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", i);.    }.   
2ee40 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65   if( sCheck.anRe
2ee50 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20  f[i]!=0 && .    
2ee60 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e     (PTRMAP_PAGEN
2ee70 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20  O(pBt, i)==i && 
2ee80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
2ee90 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
2eea0 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
2eeb0 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61  , 0, "Pointer ma
2eec0 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66  p page %d is ref
2eed0 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20  erenced", i);.  
2eee0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
2eef0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
2ef00 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64  his analysis did
2ef10 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75   not leave any u
2ef20 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a  nref() pages.  *
2ef30 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  /.  unlockBtreeI
2ef40 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
2ef50 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69  if( nRef != sqli
2ef60 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
2ef70 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
2ef80 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
2ef90 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
2efa0 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64  .      "Outstand
2efb0 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67  ing page count g
2efc0 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  oes from %d to %
2efd0 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e  d during this an
2efe0 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e  alysis",.      n
2eff0 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65  Ref, sqlite3Page
2f000 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
2f010 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
2f020 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75  }..  /* Clean  u
2f030 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72  p and report err
2f040 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ors..  */.  sqli
2f050 74 65 46 72 65 65 28 73 43 68 65 63 6b 2e 61 6e  teFree(sCheck.an
2f060 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d  Ref);.  *pnErr =
2f070 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20   sCheck.nErr;.  
2f080 72 65 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45  return sCheck.zE
2f090 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20  rrMsg;.}.#endif 
2f0a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
2f0b0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
2f0c0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
2f0d0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2f0e0 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
2f0f0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2f100 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
2f110 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
2f120 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20  tFilename(Btree 
2f130 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
2f140 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
2f150 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
2f160 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
2f170 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
2f180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2f190 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
2f1a0 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
2f1b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2f1c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f1d0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
2f1e0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
2f1f0 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  Dirname(Btree *p
2f200 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
2f210 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
2f220 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
2f230 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70  e3PagerDirname(p
2f240 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
2f250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2f260 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
2f270 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f280 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
2f290 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a  se. The return.*
2f2a0 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
2f2b0 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73  routine is the s
2f2c0 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ame regardless o
2f2d0 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f  f whether the jo
2f2e0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61  urnal file.** ha
2f2f0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  s been created o
2f300 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  r not..*/.const 
2f310 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
2f320 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
2f330 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
2f340 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
2f350 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
2f360 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
2f370 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70  Journalname(p->p
2f380 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
2f390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f3a0 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
2f3b0 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65   Copy the comple
2f3c0 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42  te content of pB
2f3d0 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f  tFrom into pBtTo
2f3e0 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
2f3f0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69  .** must be acti
2f400 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65  ve for both file
2f410 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  s..**.** The siz
2f420 65 20 6f 66 20 66 69 6c 65 20 70 42 74 46 72 6f  e of file pBtFro
2f430 6d 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64  m may be reduced
2f440 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
2f450 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  on..** If anythi
2f460 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74  ng goes wrong, t
2f470 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
2f480 6e 20 70 42 74 46 72 6f 6d 20 69 73 20 72 6f 6c  n pBtFrom is rol
2f490 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 69 6e 74  led back..*/.int
2f4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70   sqlite3BtreeCop
2f4b0 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f  yFile(Btree *pTo
2f4c0 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b  , Btree *pFrom){
2f4d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2f4e0 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c  TE_OK;.  Pgno i,
2f4f0 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61 67 65 2c   nPage, nToPage,
2f500 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74 53 68 61   iSkip;..  BtSha
2f510 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f  red *pBtTo = pTo
2f520 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65  ->pBt;.  BtShare
2f530 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72  d *pBtFrom = pFr
2f540 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20  om->pBt;..  if( 
2f550 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  pTo->inTrans!=TR
2f560 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72  ANS_WRITE || pFr
2f570 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  om->inTrans!=TRA
2f580 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2f590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2f5a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
2f5b0 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 20  BtTo->pCursor ) 
2f5c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2f5d0 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20  SY;.  nToPage = 
2f5e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2f5f0 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61  count(pBtTo->pPa
2f600 67 65 72 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  ger);.  nPage = 
2f610 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2f620 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70  count(pBtFrom->p
2f630 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20  Pager);.  iSkip 
2f640 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
2f650 41 47 45 28 70 42 74 54 6f 29 3b 0a 20 20 66 6f  AGE(pBtTo);.  fo
2f660 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=1; rc==SQLIT
2f670 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50 61 67 65  E_OK && i<=nPage
2f680 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61  ; i++){.    DbPa
2f690 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
2f6a0 20 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20   if( i==iSkip ) 
2f6b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63  continue;.    rc
2f6c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2f6d0 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  et(pBtFrom->pPag
2f6e0 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29  er, i, &pDbPage)
2f6f0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2f700 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  reak;.    rc = s
2f710 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77  qlite3PagerOverw
2f720 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  rite(pBtTo->pPag
2f730 65 72 2c 20 69 2c 20 73 71 6c 69 74 65 33 50 61  er, i, sqlite3Pa
2f740 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
2f750 67 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ge));.    sqlite
2f760 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
2f770 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
2f780 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 73  If the file is s
2f790 68 72 69 6e 6b 69 6e 67 2c 20 6a 6f 75 72 6e 61  hrinking, journa
2f7a0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
2f7b0 20 61 72 65 20 62 65 69 6e 67 20 74 72 75 6e 63   are being trunc
2f7c0 61 74 65 64 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ated.  ** so tha
2f7d0 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 6f  t they can be ro
2f7e0 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 74 68 65  lled back if the
2f7f0 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 2e 0a 20   commit fails.. 
2f800 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 50 61 67   */.  for(i=nPag
2f810 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e+1; rc==SQLITE_
2f820 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65  OK && i<=nToPage
2f830 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61  ; i++){.    DbPa
2f840 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
2f850 20 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20   if( i==iSkip ) 
2f860 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63  continue;.    rc
2f870 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2f880 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  et(pBtTo->pPager
2f890 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , i, &pDbPage);.
2f8a0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2f8b0 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ak;.    rc = sql
2f8c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f8d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  DbPage);.    sql
2f8e0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
2f8f0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
2f900 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65   /* Yeah.  It se
2f910 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c  ems wierd to cal
2f920 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69  l DontWrite() ri
2f930 67 68 74 20 61 66 74 65 72 20 57 72 69 74 65 28  ght after Write(
2f940 29 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74  ).  But.    ** t
2f950 68 61 74 20 69 73 20 62 65 63 61 75 73 65 20 74  hat is because t
2f960 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73  he names of thos
2f970 65 20 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20  e procedures do 
2f980 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20  not exactly .   
2f990 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 77 68   ** represent wh
2f9a0 61 74 20 74 68 65 79 20 64 6f 2e 20 20 57 72 69  at they do.  Wri
2f9b0 74 65 28 29 20 72 65 61 6c 6c 79 20 6d 65 61 6e  te() really mean
2f9c0 73 20 22 70 75 74 20 74 68 69 73 20 70 61 67 65  s "put this page
2f9d0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   in the.    ** r
2f9e0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2f9f0 61 6e 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64  and mark it as d
2fa00 69 72 74 79 20 73 6f 20 74 68 61 74 20 69 74 20  irty so that it 
2fa10 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a  will be written.
2fa20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61      ** to the da
2fa30 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65  tabase file late
2fa40 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29  r."  DontWrite()
2fa50 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f   undoes the seco
2fa60 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a  nd part of.    *
2fa70 2a 20 74 68 61 74 20 61 6e 64 20 70 72 65 76 65  * that and preve
2fa80 6e 74 73 20 74 68 65 20 70 61 67 65 20 66 72 6f  nts the page fro
2fa90 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  m being written 
2faa0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
2fab0 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67    The.    ** pag
2fac0 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  e is still on th
2fad0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2fae0 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64  al, though.  And
2faf0 20 74 68 61 74 20 69 73 20 74 68 65 20 77 68 6f   that is the who
2fb00 6c 65 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20  le.    ** point 
2fb10 6f 66 20 74 68 69 73 20 6c 6f 6f 70 3a 20 74 6f  of this loop: to
2fb20 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20 74 68   put pages on th
2fb30 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2fb40 61 6c 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  al. */.    sqlit
2fb50 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
2fb60 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
2fb70 20 21 72 63 20 26 26 20 6e 50 61 67 65 3c 6e 54   !rc && nPage<nT
2fb80 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 72 63 20  oPage ){.    rc 
2fb90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
2fba0 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50  uncate(pBtTo->pP
2fbb0 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
2fbc0 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  }..  if( rc ){. 
2fbd0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2fbe0 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20  ollback(pTo);.  
2fbf0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
2fc00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2fc10 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20  ITE_OMIT_VACUUM 
2fc20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
2fc30 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74   non-zero if a t
2fc40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2fc50 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
2fc60 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
2fc70 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ns(Btree *p){.  
2fc80 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d  return (p && (p-
2fc90 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
2fca0 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  WRITE));.}../*.*
2fcb0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
2fcc0 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  o if a statement
2fcd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2fce0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
2fcf0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53  qlite3BtreeIsInS
2fd00 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
2fd10 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20   return (p->pBt 
2fd20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d  && p->pBt->inStm
2fd30 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
2fd40 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
2fd50 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74 65  a read (or write
2fd60 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ) transaction is
2fd70 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
2fd80 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
2fd90 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65 20  ReadTrans(Btree 
2fda0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  *p){.  return (p
2fdb0 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21   && (p->inTrans!
2fdc0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d  =TRANS_NONE));.}
2fdd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2fde0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
2fdf0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f  pointer to a blo
2fe00 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
2fe10 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  ciated with.** a
2fe20 20 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62   single shared-b
2fe30 74 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79  tree. The memory
2fe40 20 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65   is used by clie
2fe50 6e 74 20 63 6f 64 65 20 66 6f 72 20 69 74 27 73  nt code for it's
2fe60 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73   own.** purposes
2fe70 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74   (for example, t
2fe80 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c  o store a high-l
2fe90 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f  evel schema asso
2fea0 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
2feb0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
2fec0 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c 61 79  ). The btree lay
2fed0 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72  er manages refer
2fee0 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73  ence counting is
2fef0 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sues..**.** The 
2ff00 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
2ff10 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73  is called on a s
2ff20 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79  hared-btree, nBy
2ff30 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  tes bytes of mem
2ff40 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63  ory.** are alloc
2ff50 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e  ated, zeroed, an
2ff60 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  d returned to th
2ff70 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61  e caller. For ea
2ff80 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a  ch subsequent .*
2ff90 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65  * call the nByte
2ffa0 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  s parameter is i
2ffb0 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69  gnored and a poi
2ffc0 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65  nter to the same
2ffd0 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f   blob.** of memo
2ffe0 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  ry returned. .**
2fff0 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20  .** Just before 
30000 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
30010 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20   is closed, the 
30020 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20  function passed 
30030 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65  as the .** xFree
30040 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74   argument when t
30050 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
30060 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73  tion was made is
30070 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20   invoked on the 
30080 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f  .** blob of allo
30090 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68  cated memory. Th
300a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
300b0 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69  ld not call sqli
300c0 74 65 46 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74  teFree().** on t
300d0 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62  he memory, the b
300e0 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20  tree layer does 
300f0 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  that..*/.void *s
30100 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
30110 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
30120 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46  nBytes, void(*xF
30130 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20  ree)(void *)){. 
30140 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
30150 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 21   p->pBt;.  if( !
30160 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
30170 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65 6d 61      pBt->pSchema
30180 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
30190 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42 74  nBytes);.    pBt
301a0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d 20  ->xFreeSchema = 
301b0 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20 72 65 74  xFree;.  }.  ret
301c0 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  urn pBt->pSchema
301d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
301e0 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65  n true if anothe
301f0 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73 61  r user of the sa
30200 6d 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  me shared btree 
30210 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  as the argument.
30220 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20  ** handle holds 
30230 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
30240 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  k on the sqlite_
30250 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f  master table..*/
30260 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
30270 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74  eSchemaLocked(Bt
30280 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
30290 6e 20 28 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  n (queryTableLoc
302a0 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
302b0 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51  , READ_LOCK)!=SQ
302c0 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69  LITE_OK);.}...#i
302d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
302e0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
302f0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f  *.** Obtain a lo
30300 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
30310 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20  whose root page 
30320 69 73 20 69 54 61 62 2e 20 20 54 68 65 0a 2a 2a  is iTab.  The.**
30330 20 6c 6f 63 6b 20 69 73 20 61 20 77 72 69 74 65   lock is a write
30340 20 6c 6f 63 6b 20 69 66 20 69 73 57 72 69 74 65   lock if isWrite
30350 6c 6f 63 6b 20 69 73 20 74 72 75 65 20 6f 72 20  lock is true or 
30360 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69  a read lock.** i
30370 66 20 69 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a  f it is false..*
30380 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30390 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65  eeLockTable(Btre
303a0 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20  e *p, int iTab, 
303b0 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b  u8 isWriteLock){
303c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
303d0 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 6c 6f 63 6b  TE_OK;.  u8 lock
303e0 54 79 70 65 20 3d 20 28 69 73 57 72 69 74 65 4c  Type = (isWriteL
303f0 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f 43 4b 3a 52  ock?WRITE_LOCK:R
30400 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72 63 20  EAD_LOCK);.  rc 
30410 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
30420 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
30430 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pe);.  if( rc==S
30440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30450 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
30460 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
30470 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
30480 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  rc;.}.#endif..#i
30490 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
304a0 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
304b0 20 41 72 67 75 6d 65 6e 74 20 70 43 73 72 20 6d   Argument pCsr m
304c0 75 73 74 20 62 65 20 61 20 63 75 72 73 6f 72 20  ust be a cursor 
304d0 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
304e0 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54  ng on an .** INT
304f0 4b 45 59 20 74 61 62 6c 65 20 63 75 72 72 65 6e  KEY table curren
30500 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  tly pointing at 
30510 61 20 76 61 6c 69 64 20 74 61 62 6c 65 20 65 6e  a valid table en
30520 74 72 79 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75  try. .** This fu
30530 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20  nction modifies 
30540 74 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  the data stored 
30550 61 73 20 70 61 72 74 20 6f 66 20 74 68 61 74 20  as part of that 
30560 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  entry..** Only t
30570 68 65 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 20  he data content 
30580 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69  may only be modi
30590 66 69 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  fied, it is not 
305a0 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63  possible.** to c
305b0 68 61 6e 67 65 20 74 68 65 20 6c 65 6e 67 74 68  hange the length
305c0 20 6f 66 20 74 68 65 20 64 61 74 61 20 73 74 6f   of the data sto
305d0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
305e0 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61 28  te3BtreePutData(
305f0 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  BtCursor *pCsr, 
30600 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
30610 61 6d 74 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20  amt, void *z){. 
30620 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
30630 20 70 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCsr->pBtree->p
30640 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 43  Bt;..  assert(pC
30650 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sr->isIncrblobHa
30660 6e 64 6c 65 29 3b 0a 20 20 69 66 28 20 70 43 73  ndle);.  if( pCs
30670 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
30680 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
30690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
306a0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20  TE_ABORT;.  }.. 
306b0 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70   /* Check some p
306c0 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20  reconditions: . 
306d0 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63 75   **   (a) the cu
306e0 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72  rsor is open for
306f0 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20   writing,.  **  
30700 20 28 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (b) there is no
30710 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
30720 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f  e table being mo
30730 64 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20  dified and.  ** 
30740 20 20 28 63 29 20 74 68 65 20 63 75 72 73 6f 72    (c) the cursor
30750 20 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c   points at a val
30760 69 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74  id row of an int
30770 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  Key table..  */.
30780 20 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46    if( !pCsr->wrF
30790 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
307a0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
307b0 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
307c0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
307d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
307e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
307f0 54 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63  TE );.  if( chec
30800 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d  kReadLocks(pCsr-
30810 3e 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70  >pBtree, pCsr->p
30820 67 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 29 20 29  gnoRoot, pCsr) )
30830 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30840 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
30850 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
30860 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
30870 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20  ad lock */.  }. 
30880 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74   if( pCsr->eStat
30890 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
308a0 44 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61 67  D || !pCsr->pPag
308b0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
308c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
308d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
308e0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
308f0 64 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCsr, offset, 
30900 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
30910 68 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a  har *)z, 0, 1);.
30920 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20  }../* .** Set a 
30930 66 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75 72  flag on this cur
30940 73 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68 65  sor to cache the
30950 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70 61   locations of pa
30960 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ges from the .**
30970 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 66   overflow list f
30980 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
30990 6f 77 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ow. This is used
309a0 20 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   by cursors open
309b0 65 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d  ed.** for increm
309c0 65 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e  ental blob IO on
309d0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ly..**.** This f
309e0 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66  unction sets a f
309f0 6c 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63  lag only. The ac
30a00 74 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74 69  tual page locati
30a10 6f 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f  on cache.** (sto
30a20 72 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72 2e  red in BtCursor.
30a30 61 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20  aOverflow[]) is 
30a40 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75 73  allocated and us
30a50 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a  ed by function.*
30a60 2a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  * accessPayload(
30a70 29 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66 75  ) (the worker fu
30a80 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74  nction for sqlit
30a90 65 33 42 74 72 65 65 44 61 74 61 28 29 20 61 6e  e3BtreeData() an
30aa0 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  d.** sqlite3Btre
30ab0 65 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a  ePutData())..*/.
30ac0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
30ad0 65 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42  eCacheOverflow(B
30ae0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
30af0 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
30b00 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
30b10 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43 75  );.  assert(!pCu
30b20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
30b30 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
30b40 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23  bHandle = 1;.}.#
30b50 65 6e 64 69 66 0a                                endif.