/ Hex Artifact Content
Login

Artifact 9179039d9a023da986c168e276680fed9dcc57fd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 33 38 33 20 32 30 30 37 2f 30  c,v 1.383 2007/0
0190: 35 2f 31 37 20 31 38 3a 32 38 3a 31 31 20 64 61  5/17 18:28:11 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20  ./*.** Set this 
0340: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0350: 74 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74  to 1 to enable t
0360: 72 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65  racing using the
0370: 20 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e   TRACE.** macro.
0380: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
0390: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
03a0: 62 74 72 65 65 5f 74 72 61 63 65 3d 30 3b 20 20  btree_trace=0;  
03b0: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
03c0: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 65 6e  e tracing */.#en
03d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
03e0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
03f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
0400: 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65  ckReadLocks(Btre
0410: 65 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72  e*,Pgno,BtCursor
0420: 2a 29 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  *);...#ifdef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
0450: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
0460: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20  eryTableLock(), 
0470: 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61 6e 64 20  lockTable() and 
0480: 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
0490: 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74  ).  ** manipulat
04a0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
04b0: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20   BtShared.pLock 
04c0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75 73 65 64  linked list used
04d0: 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73   to store.  ** s
04e0: 68 61 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c  hared-cache tabl
04f0: 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49  e level locks. I
0500: 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73  f the library is
0510: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
0520: 68 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63  he.  ** shared-c
0530: 61 63 68 65 20 66 65 61 74 75 72 65 20 64 69 73  ache feature dis
0540: 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72  abled, then ther
0550: 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f  e is only ever o
0560: 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20  ne user.  ** of 
0570: 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74  each BtShared st
0580: 72 75 63 74 75 72 65 20 61 6e 64 20 73 6f 20 74  ructure and so t
0590: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e  his locking is n
05a0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 20  ot necessary. . 
05b0: 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20 74 68   ** So define th
05c0: 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65 64 20 66  e lock related f
05d0: 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f  unctions as no-o
05e0: 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69  ps..  */.  #defi
05f0: 6e 65 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ne queryTableLoc
0600: 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  k(a,b,c) SQLITE_
0610: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 6c 6f 63  OK.  #define loc
0620: 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29 20 53 51  kTable(a,b,c) SQ
0630: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
0640: 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65  e unlockAllTable
0650: 73 28 61 29 0a 23 65 6c 73 65 0a 0a 2f 2a 0a 2a  s(a).#else../*.*
0660: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
0670: 66 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f btree handle p
0680: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
0690: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
06a0: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
06b0: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
06c0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
06d0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
06e0: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
06f0: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
0700: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
0710: 20 28 62 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63   (by calling loc
0720: 6b 54 61 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a  kTable()), or.**
0730: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
0740: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
0750: 20 69 6e 74 20 71 75 65 72 79 54 61 62 6c 65 4c   int queryTableL
0760: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
0770: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
0780: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
0790: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
07a0: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
07b0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
07c0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
07d0: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
07e0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
07f0: 20 30 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61   0==sqlite3Threa
0800: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
0810: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 29  >useSharedData )
0820: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
0830: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
0840: 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69  * This (along wi
0850: 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20  th lockTable()) 
0860: 69 73 20 77 68 65 72 65 20 74 68 65 20 52 65 61  is where the Rea
0870: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0880: 67 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20  g is.  ** dealt 
0890: 77 69 74 68 2e 20 49 66 20 74 68 65 20 63 61 6c  with. If the cal
08a0: 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20  ler is querying 
08b0: 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  for a read-lock 
08c0: 61 6e 64 20 74 68 65 20 66 6c 61 67 20 69 73 0a  and the flag is.
08d0: 20 20 2a 2a 20 73 65 74 2c 20 69 74 20 69 73 20    ** set, it is 
08e0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20  unconditionally 
08f0: 67 72 61 6e 74 65 64 20 2d 20 65 76 65 6e 20 69  granted - even i
0900: 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69 74  f there are writ
0910: 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20  e-locks.  ** on 
0920: 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61 20  the table. If a 
0930: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65  write-lock is re
0940: 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65 61  quested, the Rea
0950: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0960: 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  g.  ** is not co
0970: 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20  nsidered..  **. 
0980: 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20   ** In function 
0990: 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69 66 20  lockTable(), if 
09a0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64  a read-lock is d
09b0: 65 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20  emanded and the 
09c0: 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d  .  ** ReadUncomm
09d0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
09e0: 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61  t, no entry is a
09f0: 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b  dded to the lock
0a00: 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74  s list .  ** (Bt
0a10: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20  Shared.pLock).. 
0a20: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d   **.  ** To summ
0a30: 61 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65  arize: If the Re
0a40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0a50: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
0a60: 72 65 61 64 20 63 75 72 73 6f 72 73 20 64 6f 0a  read cursors do.
0a70: 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74 65 20    ** not create 
0a80: 6f 72 20 72 65 73 70 65 63 74 20 74 61 62 6c 65  or respect table
0a90: 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b   locks. The lock
0aa0: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 66 6f  ing procedure fo
0ab0: 72 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d  r a .  ** write-
0ac0: 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  cursor does not 
0ad0: 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
0ae0: 66 28 20 0a 20 20 20 20 21 70 2d 3e 70 53 71 6c  f( .    !p->pSql
0af0: 69 74 65 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28  ite || .    0==(
0b00: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67  p->pSqlite->flag
0b10: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
0b20: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
0b30: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
0b40: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
0b50: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
0b60: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
0b70: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
0b80: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
0b90: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
0ba0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
0bb0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
0bc0: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
0bd0: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
0be0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
0bf0: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
0c00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
0c10: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
0c20: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
0c30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
0c40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
0c50: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
0c60: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
0c70: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
0c80: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
0c90: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
0ca0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
0cb0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
0cc0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
0cd0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
0ce0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
0cf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
0d00: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
0d10: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
0d20: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
0d30: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c  _BUSY and.** SQL
0d40: 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c  ITE_NOMEM may al
0d50: 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  so be returned..
0d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
0d70: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
0d80: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
0d90: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
0da0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
0db0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
0dc0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
0dd0: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20  k *pIter;..  /* 
0de0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
0df0: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
0e00: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
0e10: 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  ed */.  if( 0==s
0e20: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
0e30: 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53  ReadOnly()->useS
0e40: 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20 20  haredData ){.   
0e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0e60: 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  K;.  }..  assert
0e70: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
0e80: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
0e90: 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b  Table, eLock) );
0ea0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65  ..  /* If the re
0eb0: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
0ec0: 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61  lag is set and a
0ed0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65   read-lock is re
0ee0: 71 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65  quested,.  ** re
0ef0: 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f  turn early witho
0f00: 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74  ut adding an ent
0f10: 72 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72  ry to the BtShar
0f20: 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53  ed.pLock list. S
0f30: 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20  ee.  ** comment 
0f40: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72  in function quer
0f50: 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72  yTableLock() for
0f60: 20 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61   more info on ha
0f70: 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65  ndling .  ** the
0f80: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0f90: 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66   flag..  */.  if
0fa0: 28 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69  ( .    (p->pSqli
0fb0: 74 65 29 20 26 26 20 0a 20 20 20 20 28 70 2d 3e  te) && .    (p->
0fc0: 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53  pSqlite->flags&S
0fd0: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
0fe0: 69 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28  itted) && .    (
0ff0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1000: 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21  ) &&.    iTable!
1010: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
1020: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1030: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
1040: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
1050: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
1060: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
1070: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
1080: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1090: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
10a0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
10b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
10c0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
10d0: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
10e0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
10f0: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
1100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1110: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1120: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
1130: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
1140: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
1150: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
1160: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
1170: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
1180: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
1190: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
11a0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
11b0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
11c0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
11d0: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  Malloc(sizeof(Bt
11e0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
11f0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
1200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1210: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
1220: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
1230: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
1240: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1250: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
1260: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1270: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
1280: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
1290: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
12a0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
12b0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
12c0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
12d0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
12e0: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
12f0: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
1300: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
1310: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
1320: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
1330: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
1340: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
1350: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
1360: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1370: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
1380: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
1390: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
13a0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
13b0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
13c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
13d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13e0: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
13f0: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
1400: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
1410: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f   calls to the lo
1420: 63 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f  ckTable().** pro
1430: 63 65 64 75 72 65 29 20 68 65 6c 64 20 62 79 20  cedure) held by 
1440: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a  Btree handle p..
1450: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1460: 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42  nlockAllTables(B
1470: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 4c 6f  tree *p){.  BtLo
1480: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
1490: 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20  ->pBt->pLock;.. 
14a0: 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
14b0: 64 2d 63 61 63 68 65 20 65 78 74 65 6e 73 69 6f  d-cache extensio
14c0: 6e 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  n is not enabled
14d0: 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  , there should b
14e0: 65 20 6e 6f 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20  e no.  ** locks 
14f0: 69 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  in the BtShared.
1500: 70 4c 6f 63 6b 20 6c 69 73 74 2c 20 6d 61 6b 69  pLock list, maki
1510: 6e 67 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  ng this procedur
1520: 65 20 61 20 6e 6f 2d 6f 70 2e 20 41 73 73 65 72  e a no-op. Asser
1530: 74 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  t.  ** that this
1540: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
1550: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1560: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
1570: 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61  adOnly()->useSha
1580: 72 65 64 44 61 74 61 20 7c 7c 20 30 3d 3d 2a 70  redData || 0==*p
1590: 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c  pIter );..  whil
15a0: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
15b0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
15c0: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 69  = *ppIter;.    i
15d0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
15e0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
15f0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
1600: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1610: 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  eFree(pLock);.  
1620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1630: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
1640: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1650: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1660: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1670: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
1680: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
1690: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
16a0: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
16b0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 23 69 66  eference */..#if
16c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16d0: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
16e0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
16f0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1700: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
1710: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
1720: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1730: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1740: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
1750: 20 2a 70 43 75 72 29 7b 0a 20 20 73 71 6c 69 74   *pCur){.  sqlit
1760: 65 46 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  eFree(pCur->aOve
1770: 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e  rflow);.  pCur->
1780: 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d  aOverflow = 0;.}
1790: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
17a0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
17b0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
17c0: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
17d0: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
17e0: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
17f0: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
1800: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
1810: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1820: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
1830: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
1840: 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42  r *p;.  for(p=pB
1850: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1860: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1870: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1880: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
1890: 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
18a0: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
18b0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
18c0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
18d0: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
18e0: 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(x).#endif../*.
18f0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
1900: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
1910: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
1920: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
1930: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
1940: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
1950: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
1960: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
1970: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74  QUIRESEEK..*/.st
1980: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
1990: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
19a0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
19b0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
19c0: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
19d0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
19e0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
19f0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 72 63  r->pKey );..  rc
1a00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
1a10: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
1a20: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a  ur->nKey);..  /*
1a30: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1a40: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
1a50: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
1a60: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
1a70: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
1a80: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
1a90: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
1aa0: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
1ab0: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
1ac0: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
1ad0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1ae0: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
1af0: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
1b00: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
1b10: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
1b20: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
1b30: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
1b40: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
1b50: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ta..  */.  if( r
1b60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b70: 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  0==pCur->pPage->
1b80: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
1b90: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
1ba0: 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65  Malloc(pCur->nKe
1bb0: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  y);.    if( pKey
1bc0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1bd0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1be0: 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b  Cur, 0, pCur->nK
1bf0: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
1c00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c10: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
1c20: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
1c30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c40: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1c50: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
1c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c80: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
1c90: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70  assert( !pCur->p
1ca0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  Page->intKey || 
1cb0: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a  !pCur->pKey );..
1cc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  _OK ){.    relea
1ce0: 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
1cf0: 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ge);.    pCur->p
1d00: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
1d10: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1d20: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
1d30: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
1d40: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1d50: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1d60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
1d70: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
1d80: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
1d90: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
1da0: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
1db0: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
1dc0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
1dd0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
1de0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
1df0: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
1e00: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
1e10: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
1e20: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
1e30: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
1e40: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
1e50: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
1e60: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
1e70: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
1e80: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
1e90: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
1ea0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1eb0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1ec0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
1ed0: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
1ee0: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
1ef0: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
1f00: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
1f10: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1f20: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
1f30: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1f40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
1f50: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1f60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fa0: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
1fb0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
1fc0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1fd0: 64 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  d clearCursorPos
1fe0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
1ff0: 70 43 75 72 29 7b 0a 20 20 73 71 6c 69 74 65 46  pCur){.  sqliteF
2000: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
2010: 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20  .  pCur->pKey = 
2020: 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  0;.  pCur->eStat
2030: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2040: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  ID;.}../*.** Res
2050: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
2060: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
2070: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
2080: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
2090: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
20a0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
20b0: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
20c0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
20d0: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
20e0: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
20f0: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
2100: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
2110: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
2120: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
2130: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
2140: 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2150: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
2160: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
2170: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
2180: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20  sition()..**.** 
2190: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
21a0: 67 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e 74 20  gument argument 
21b0: 2d 20 64 6f 53 65 65 6b 20 2d 20 69 73 20 66 61  - doSeek - is fa
21c0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
21d0: 64 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69  d of .** returni
21e0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
21f0: 20 69 74 27 73 20 73 61 76 65 64 20 70 6f 73 69   it's saved posi
2200: 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65 64 20  tion, any saved 
2210: 70 6f 73 69 74 69 6f 6e 20 69 73 20 64 65 6c 65  position is dele
2220: 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  ted.** and the c
2230: 75 72 73 6f 72 20 73 74 61 74 65 20 73 65 74 20  ursor state set 
2240: 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  to CURSOR_INVALI
2250: 44 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  D..*/.int sqlite
2260: 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f 72 43  3BtreeRestoreOrC
2270: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2280: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
2290: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
22a0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22b0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51  tate==CURSOR_REQ
22c0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 23 69 66 6e  UIRESEEK );.#ifn
22d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22e0: 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 28 20 70  INCRBLOB.  if( p
22f0: 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
2300: 61 6e 64 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  andle ){.    ret
2310: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
2320: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
2330: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2340: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2350: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2360: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
2370: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
2380: 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e  nKey, 0, &pCur->
2390: 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  skip);.  if( rc=
23a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
23c0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
23d0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
23e0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23f0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2400: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2410: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2420: 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65  ALID );.  }.  re
2430: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
2440: 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  ine restoreOrCle
2450: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2460: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
2470: 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te==CURSOR_REQUI
2480: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
2490: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24a0: 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  RestoreOrClearCu
24b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
24c0: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
24d0: 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66  ITE_OK)..#ifndef
24e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
24f0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
2500: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
2510: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
2520: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
2530: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
2540: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2550: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2560: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2570: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
2580: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
2590: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
25a0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
25b0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
25c0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
25d0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
25e0: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
25f0: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
2600: 69 6e 74 20 69 50 74 72 4d 61 70 20 3d 20 28 70  int iPtrMap = (p
2610: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
2620: 4d 61 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  MapPage;.  int r
2630: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
2640: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
2650: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
2660: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2670: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
2680: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
2690: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
26a0: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
26b0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
26c0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
26d0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
26e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
26f0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
2700: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
2710: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
2720: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
2730: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
2740: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
2750: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
2760: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
2770: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
2780: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
2790: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
27a0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
27b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
27c0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
27d0: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
27e0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
27f0: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
2800: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
2810: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
2820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
2830: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
2840: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
2850: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
2860: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
2870: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
2880: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
2890: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
28a0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
28b0: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
28c0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
28d0: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
28e0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
28f0: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
2900: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
2910: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
2920: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
2930: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
2940: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
2950: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2960: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
2970: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2980: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2990: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
29a0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
29b0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
29c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
29d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
29e0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
29f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2a00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
2a10: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
2a20: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
2a30: 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29  OFFSET(pBt, key)
2a40: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
2a50: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
2a60: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
2a70: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
2a80: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
2a90: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
2aa0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
2ab0: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
2ac0: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
2ad0: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
2ae0: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
2af0: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
2b00: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b10: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
2b20: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b40: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
2b50: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
2b60: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
2b70: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
2b80: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
2b90: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2ba0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
2bb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bc0: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
2bd0: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
2be0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
2bf0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
2c00: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
2c10: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
2c20: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
2c30: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
2c40: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
2c50: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
2c60: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
2c70: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
2c80: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2c90: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
2ca0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
2cb0: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
2cc0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
2cd0: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
2ce0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
2cf0: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
2d00: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
2d10: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
2d20: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
2d30: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
2d40: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
2d50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2d60: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
2d70: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
2d80: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2d90: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
2da0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
2db0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2dc0: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
2dd0: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
2de0: 6e 74 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d 61  nt rc;..  iPtrma
2df0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
2e00: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
2e10: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e20: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
2e30: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
2e40: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
2e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2e60: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
2e70: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
2e80: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
2e90: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
2ea0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
2eb0: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  SET(pBt, key);. 
2ec0: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
2ed0: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
2ee0: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
2ef0: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
2f00: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
2f10: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
2f20: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
2f30: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
2f40: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45  Page);.  if( *pE
2f50: 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70  Type<1 || *pETyp
2f60: 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e>5 ) return SQL
2f70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2f90: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
2fa0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
2fb0: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a  UTOVACUUM */../*
2fc0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
2fd0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
2fe0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
2ff0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
3000: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
3010: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
3020: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
3030: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
3040: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
3050: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
3060: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3070: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
3080: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
3090: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
30a0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
30b0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
30c0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a  pPage, iCell) \.
30d0: 20 20 28 28 70 50 61 67 65 29 2d 3e 61 44 61 74    ((pPage)->aDat
30e0: 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 28 70  a + get2byte(&(p
30f0: 50 61 67 65 29 2d 3e 61 44 61 74 61 5b 28 70 50  Page)->aData[(pP
3100: 61 67 65 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  age)->cellOffset
3110: 2b 32 2a 28 69 43 65 6c 6c 29 5d 29 29 0a 75 38  +2*(iCell)])).u8
3120: 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 69   *sqlite3BtreeFi
3130: 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  ndCell(MemPage *
3140: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
3150: 29 7b 0a 20 20 75 38 20 2a 64 61 74 61 20 3d 20  ){.  u8 *data = 
3160: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
3170: 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30  assert( iCell>=0
3180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
3190: 65 6c 6c 3c 67 65 74 32 62 79 74 65 28 26 64 61  ell<get2byte(&da
31a0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
31b0: 73 65 74 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74  set+3]) );.  ret
31c0: 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  urn findCell(pPa
31d0: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  ge, iCell);.}../
31e0: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
31f0: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
3200: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
3210: 46 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  FindCell() that 
3220: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
3230: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
3240: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
3250: 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a  s.  See insert.*
3260: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e  /.static u8 *fin
3270: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65  dOverflowCell(Me
3280: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
3290: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20  t iCell){.  int 
32a0: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  i;.  for(i=pPage
32b0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
32c0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
32d0: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
32e0: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
32f0: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
3300: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
3310: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
3320: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
3330: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
3340: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
3350: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
3360: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
3370: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
3380: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
3390: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
33a0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
33b0: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
33c0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
33d0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
33e0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
33f0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
3400: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
3410: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
3420: 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  n.  sqlite3Btree
3430: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
3440: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
3450: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
3460: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71   argument and sq
3470: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3480: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
3490: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
34a0: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
34b0: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
34c0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
34d0: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
34e0: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
34f0: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
3500: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
3510: 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   of.** sqlite3Bt
3520: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3530: 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f  ). Using some co
3540: 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69  mpilers, this wi
3550: 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f  ll be faster..*/
3560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
3570: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
3580: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
3590: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
35a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
35b0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
35c0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
35d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
35e0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
35f0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
3600: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
3610: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
3620: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ucture */.){.  i
3630: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
3640: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3650: 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63   bytes in cell c
3660: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f  ontent header */
3670: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
3680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3690: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
36a0: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
36b0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
36c0: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
36d0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
36e0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
36f0: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
3700: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
3710: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
3720: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
3730: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
3740: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
3750: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
3760: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79  &pCell[n], &nPay
3770: 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  load);.  }else{.
3780: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30      nPayload = 0
3790: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
37a0: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
37b0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
37c0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  tKey ){.    n +=
37d0: 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c   getVarint(&pCel
37e0: 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26 70 49  l[n], (u64 *)&pI
37f0: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65  nfo->nKey);.  }e
3800: 6c 73 65 7b 0a 20 20 20 20 75 33 32 20 78 3b 0a  lse{.    u32 x;.
3810: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
3820: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
3830: 26 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  &x);.    pInfo->
3840: 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20 6e 50  nKey = x;.    nP
3850: 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20 20 7d  ayload += x;.  }
3860: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
3870: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
3880: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
3890: 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  = n;.  if( nPayl
38a0: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
38b0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
38c0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
38d0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
38e0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
38f0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
3900: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
3910: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
3920: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
3930: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
3940: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Size;          /
3950: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
3960: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
3970: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e  bytes */.    pIn
3980: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61  fo->nLocal = nPa
3990: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
39a0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
39b0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
39c0: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69  yload + n;.    i
39d0: 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20  f( nSize<4 ){.  
39e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
39f0: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
3a00: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
3a10: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
3a20: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a  fo->nSize = nSiz
3a30: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3a40: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
3a50: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
3a60: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
3a70: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
3a80: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
3a90: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
3aa0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
3ab0: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
3ac0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
3ad0: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
3ae0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
3af0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
3b00: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
3b10: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
3b20: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
3b30: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
3b40: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
3b50: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
3b60: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
3b70: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
3b80: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
3b90: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
3ba0: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
3bb0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
3bc0: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
3bd0: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
3be0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
3bf0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
3c00: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
3c10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
3c20: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
3c30: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
3c40: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
3c50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
3c60: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
3c70: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
3c80: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
3c90: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
3ca0: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
3cb0: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
3cc0: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
3cd0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
3ce0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
3cf0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
3d00: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
3d10: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
3d20: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
3d30: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
3d40: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
3d50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
3d60: 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20  e - 4);.    if( 
3d70: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
3d80: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
3d90: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72  fo->nLocal = sur
3da0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
3db0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
3dc0: 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  ocal = minLocal;
3dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
3de0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49  ->iOverflow = pI
3df0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b  nfo->nLocal + n;
3e00: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
3e10: 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72  e = pInfo->iOver
3e20: 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a  flow + 4;.  }.}.
3e30: 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c  #define parseCel
3e40: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
3e50: 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74  pInfo) \.  sqlit
3e60: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3e70: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
3e80: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
3e90: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
3ea0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  ).void sqlite3Bt
3eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
3ec0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
3ed0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
3ee0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
3ef0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
3f00: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
3f10: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
3f20: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
3f30: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
3f40: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
3f50: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
3f60: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
3f70: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
3f80: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
3f90: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
3fa0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
3fb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
3fc0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
3fd0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
3fe0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
3ff0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
4000: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
4010: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
4020: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
4030: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
4040: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
4050: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
4060: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
4070: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
4080: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23  ll pointer..*/.#
4090: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
40a0: 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a  atic int cellSiz
40b0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
40c0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
40d0: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
40e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
40f0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
4100: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72  ell, &info);.  r
4110: 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65  eturn info.nSize
4120: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ;.}.#endif.stati
4130: 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a 65 50 74  c int cellSizePt
4140: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
4150: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
4160: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
4170: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4180: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
4190: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
41a0: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
41b0: 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ize;.}..#ifndef 
41c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
41d0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
41e0: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
41f0: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
4200: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
4210: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
4220: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
4230: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
4240: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
4250: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
4260: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
4270: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
4280: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
4290: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
42a0: 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43  pCell){.  if( pC
42b0: 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49  ell ){.    CellI
42c0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 73 71  nfo info;.    sq
42d0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
42e0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
42f0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
4300: 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e   assert( (info.n
4310: 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
4320: 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
4330: 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  )==info.nPayload
4340: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66   );.    if( (inf
4350: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4360: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4370: 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
4380: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f   ){.      Pgno o
4390: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
43a0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
43b0: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65  flow]);.      re
43c0: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
43d0: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
43e0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
43f0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
4400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4410: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4420: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
4430: 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43  ll with index iC
4440: 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
4450: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
4460: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
4470: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
4480: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
4490: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
44a0: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
44b0: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
44c0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
44d0: 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20  PutOvfl(MemPage 
44e0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
44f0: 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  l){.  u8 *pCell;
4500: 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f  .  pCell = findO
4510: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
4520: 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e, iCell);.  ret
4530: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
4540: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4550: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  l);.}.#endif.../
4560: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
4570: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
4580: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
4590: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
45a0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
45b0: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
45c0: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
45d0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
45e0: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
45f0: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
4600: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
4610: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
4620: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
4630: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
4640: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
4650: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
4660: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
4670: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
4680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
4690: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
46a0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
46b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
46c0: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
46d0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ll */.  int addr
46e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
46f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
4700: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
4710: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
4720: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ray */.  int hdr
4730: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4740: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
4750: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
4760: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
4790: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
47a0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
47b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
47c0: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
47d0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
47e0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
47f0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
4800: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
4810: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
4820: 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20  int brk;        
4830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
4840: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
4850: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
4860: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4880: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
4890: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
48a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
48b0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
48c0: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
48d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
48e0: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
48f0: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
4900: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  ell content */..
4910: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4920: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
4930: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
4940: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4950: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
4960: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
4970: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
4980: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
4990: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
49a0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
49b0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74  erflow==0 );.  t
49c0: 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  emp = sqliteMall
49d0: 6f 63 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  oc( pPage->pBt->
49e0: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  pageSize );.  if
49f0: 28 20 74 65 6d 70 3d 3d 30 20 29 20 72 65 74 75  ( temp==0 ) retu
4a00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4a10: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
4a20: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
4a30: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
4a40: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
4a50: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
4a60: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
4a70: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
4a80: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
4a90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
4aa0: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
4ab0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
4ac0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
4ad0: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
4ae0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
4af0: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b  memcpy(&temp[brk
4b00: 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75  ], &data[brk], u
4b10: 73 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29  sableSize - brk)
4b20: 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65  ;.  brk = usable
4b30: 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Size;.  for(i=0;
4b40: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
4b50: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
4b60: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
4b70: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
4b80: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
4b90: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
4ba0: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
4bb0: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
4bc0: 20 20 61 73 73 65 72 74 28 20 70 63 3c 70 50 61    assert( pc<pPa
4bd0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
4be0: 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ize );.    size 
4bf0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
4c00: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
4c10: 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65  .    brk -= size
4c20: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
4c30: 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70  ta[brk], &temp[p
4c40: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70  c], size);.    p
4c50: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 62  ut2byte(pAddr, b
4c60: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
4c70: 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73  t( brk>=cellOffs
4c80: 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  et+2*nCell );.  
4c90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
4ca0: 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64  dr+5], brk);.  d
4cb0: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
4cc0: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
4cd0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  0;.  data[hdr+7]
4ce0: 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63   = 0;.  addr = c
4cf0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
4d00: 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  l;.  memset(&dat
4d10: 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d  a[addr], 0, brk-
4d20: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  addr);.  sqliteF
4d30: 72 65 65 28 74 65 6d 70 29 3b 0a 20 20 72 65 74  ree(temp);.  ret
4d40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4d50: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
4d60: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
4d70: 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e  space on a page.
4d80: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
4d90: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
4da0: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74  ge->aData[] of t
4db0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
4dc0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f  .** the new allo
4dd0: 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72  cation. Or retur
4de0: 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73 20  n 0 if there is 
4df0: 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a  not enough free.
4e00: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ** space on the 
4e10: 70 61 67 65 20 74 6f 20 73 61 74 69 73 66 79 20  page to satisfy 
4e20: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  the allocation r
4e30: 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  equest..**.** If
4e40: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
4e50: 6e 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65  ns nBytes of fre
4e60: 65 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73  e space but does
4e70: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   not contain.** 
4e80: 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67  nBytes of contig
4e90: 75 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c  uous free space,
4ea0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
4eb0: 6e 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ne automatically
4ec0: 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67  .** calls defrag
4ed0: 65 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63  ementPage() to c
4ee0: 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66  onsolidate all f
4ef0: 72 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65  ree space before
4f00: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20   .** allocating 
4f10: 74 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a  the new chunk..*
4f20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
4f30: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
4f40: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
4f50: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  Byte){.  int add
4f60: 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e  r, pc, hdr;.  in
4f70: 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46  t size;.  int nF
4f80: 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a  rag;.  int top;.
4f90: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69    int nCell;.  i
4fa0: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  nt cellOffset;. 
4fb0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4fc0: 64 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20  data;.  .  data 
4fd0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
4fe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4ff0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
5000: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
5010: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5020: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 69  Page->pBt );.  i
5030: 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42 79  f( nByte<4 ) nBy
5040: 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70 50  te = 4;.  if( pP
5050: 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65  age->nFree<nByte
5060: 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   || pPage->nOver
5070: 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e 20  flow>0 ) return 
5080: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  0;.  pPage->nFre
5090: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64  e -= nByte;.  hd
50a0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
50b0: 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  fset;..  nFrag =
50c0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
50d0: 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a  if( nFrag<60 ){.
50e0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
50f0: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
5100: 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69  ng for a slot bi
5110: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
5120: 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  sfy the.    ** s
5130: 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f  pace request. */
5140: 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b  .    addr = hdr+
5150: 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  1;.    while( (p
5160: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
5170: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
5180: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
5190: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
51a0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
51b0: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
51c0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42       if( size<nB
51d0: 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  yte+4 ){.       
51e0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
51f0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
5200: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
5210: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46  data[hdr+7] = nF
5220: 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79  rag + size - nBy
5230: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  te;.          re
5240: 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20  turn pc;.       
5250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5260: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5270: 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79  [pc+2], size-nBy
5280: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  te);.          r
5290: 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20  eturn pc + size 
52a0: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
52b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
52c0: 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20   addr = pc;.    
52d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
52e0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
52f0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
5300: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
5310: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
5320: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
5330: 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a  tent area..  */.
5340: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
5350: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
5360: 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
5370: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
5380: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
5390: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
53a0: 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  et;.  if( nFrag>
53b0: 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65  =60 || cellOffse
53c0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f  t + 2*nCell > to
53d0: 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  p - nByte ){.   
53e0: 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74 50   if( defragmentP
53f0: 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65 74  age(pPage) ) ret
5400: 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d  urn 0;.    top =
5410: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5420: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74  hdr+5]);.  }.  t
5430: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61  op -= nByte;.  a
5440: 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65  ssert( cellOffse
5450: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74  t + 2*nCell <= t
5460: 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  op );.  put2byte
5470: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5480: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
5490: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
54a0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
54b0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
54c0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
54d0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
54e0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
54f0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
5500: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
5510: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
5520: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
5530: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
5540: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
5550: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
5560: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
5570: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
5580: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
5590: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
55a0: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
55b0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
55c0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
55d0: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
55e0: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
55f0: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
5600: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
5610: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
5620: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
5630: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5640: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5650: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5660: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5670: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5680: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
5690: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
56a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
56b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
56c0: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
56d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
56e0: 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 69  Size );.  if( si
56f0: 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b  ze<4 ) size = 4;
5700: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5710: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
5720: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
5730: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
5740: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
5750: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
5760: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
5770: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
5780: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
5790: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
57a0: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
57b0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
57c0: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
57d0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
57e0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
57f0: 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61  s */.  hdr = pPa
5800: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
5810: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
5820: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
5830: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
5840: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
5850: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
5860: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
5870: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
5880: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
5890: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
58a0: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
58b0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
58c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  }.  assert( pbeg
58d0: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
58e0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
58f0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
5900: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
5910: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
5920: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
5930: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
5940: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
5950: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
5960: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
5970: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
5980: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65  e->nFree += size
5990: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
59a0: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
59b0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
59c0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
59d0: 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  et + 1;.  while(
59e0: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
59f0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5a00: 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  )>0 ){.    int p
5a10: 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20  next, psize;.   
5a20: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
5a30: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  addr );.    asse
5a40: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
5a50: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
5a60: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
5a70: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
5a80: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
5a90: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
5aa0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
5ab0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
5ac0: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
5ad0: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
5ae0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
5af0: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
5b00: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
5b10: 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72 61       assert( fra
5b20: 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  g<=data[pPage->h
5b30: 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20  drOffset+7] );. 
5b40: 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d       data[pPage-
5b50: 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d  >hdrOffset+7] -=
5b60: 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74   frag;.      put
5b70: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
5b80: 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64  in], get2byte(&d
5b90: 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20  ata[pnext]));.  
5ba0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
5bb0: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e  ta[pbegin+2], pn
5bc0: 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64 61  ext+get2byte(&da
5bd0: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65  ta[pnext+2])-pbe
5be0: 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gin);.    }else{
5bf0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
5c00: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
5c10: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
5c20: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
5c30: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
5c40: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
5c50: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
5c60: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
5c70: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
5c80: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
5c90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
5ca0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
5cb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5cc0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
5cd0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
5ce0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
5cf0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
5d00: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
5d10: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
5d20: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5d30: 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  op + get2byte(&d
5d40: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b  ata[pbegin+2]));
5d50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
5d60: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
5d70: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
5d80: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
5d90: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
5da0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
5db0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
5dc0: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
5dd0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
5de0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f  static void deco
5df0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
5e00: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
5e10: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
5e20: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
5e30: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
5e40: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
5e50: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
5e60: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
5e70: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
5e80: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ;.  pPage->intKe
5e90: 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  y = (flagByte & 
5ea0: 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
5eb0: 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
5ec0: 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
5ed0: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50   = (flagByte & P
5ee0: 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b  TF_ZERODATA)!=0;
5ef0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
5f00: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
5f10: 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61  _LEAF)!=0;.  pPa
5f20: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
5f30: 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61   = 4*(pPage->lea
5f40: 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70  f==0);.  pBt = p
5f50: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
5f60: 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f   flagByte & PTF_
5f70: 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20  LEAFDATA ){.    
5f80: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
5f90: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
5fa0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
5fb0: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
5fc0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
5fd0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
5fe0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d  else{.    pPage-
5ff0: 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20  >leafData = 0;. 
6000: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
6010: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
6020: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
6030: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
6040: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
6050: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
6060: 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74  !(pPage->zeroDat
6070: 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65  a || (!pPage->le
6080: 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  af && pPage->lea
6090: 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  fData));.}../*.*
60a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
60b0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
60c0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
60d0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  k block..**.** T
60e0: 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
60f0: 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70  eter must be a p
6100: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
6110: 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69  mPage which.** i
6120: 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  s the parent of 
6130: 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69  the page being i
6140: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
6150: 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54   root of a.** BT
6160: 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e  ree has no paren
6170: 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61  t and so for tha
6180: 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d  t page, pParent=
6190: 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  =NULL..**.** Ret
61a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
61b0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
61c0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
61d0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
61e0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
61f0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
6200: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
6210: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
6220: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
6230: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
6240: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
6250: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
6260: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
6270: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
6280: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
6290: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
62a0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
62b0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
62c0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
62d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
62e0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
62f0: 20 70 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74   page to be init
6300: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d  ialized */.  Mem
6310: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20  Page *pParent   
6320: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
6330: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6340: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63  L */.){.  int pc
6350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6360: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
6370: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
6380: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
6390: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
63a0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
63b0: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
63c0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
63d0: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
63e0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
63f0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
6400: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
6410: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
6420: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
6430: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  re */.  int usab
6440: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
6450: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
6460: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
6470: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
6480: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
6490: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
64a0: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
64b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
64c0: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
64d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
64e0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
64f0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
6500: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
6510: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
6520: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
6530: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20  tent area */..  
6540: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
6550: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 21  ;.  assert( pBt!
6560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6570: 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50  pParent==0 || pP
6580: 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20  arent->pBt==pBt 
6590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
65a0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
65b0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
65c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
65d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
65e0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 26 28  age->aData == &(
65f0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
6600: 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67  pPage)[-pBt->pag
6610: 65 53 69 7a 65 5d 20 29 3b 0a 20 20 69 66 28 20  eSize] );.  if( 
6620: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d  pPage->pParent!=
6630: 70 50 61 72 65 6e 74 20 26 26 20 28 70 50 61 67  pParent && (pPag
6640: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c  e->pParent!=0 ||
6650: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20   pPage->isInit) 
6660: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
6670: 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64  rent page should
6680: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e   never change un
6690: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 69 73  less the file is
66a0: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
66b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
66c0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
66d0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
66e0: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
66f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
6700: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
6710: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b  && pParent!=0 ){
6720: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
6730: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
6740: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
6750: 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
6760: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20  age);.  }.  hdr 
6770: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
6780: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
6790: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64 65 63  ge->aData;.  dec
67a0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
67b0: 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50  data[hdr]);.  pP
67c0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
67d0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   0;.  pPage->idx
67e0: 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61  Shift = 0;.  usa
67f0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
6800: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
6810: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
6820: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
6830: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
6840: 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20  ->leaf;.  top = 
6850: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
6860: 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d  dr+5]);.  pPage-
6870: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
6880: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
6890: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
68a0: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
68b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
68c0: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
68d0: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
68e0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
68f0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
6900: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6910: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
6920: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
6930: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
6940: 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
6950: 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41  o!=1 ){.    /* A
6960: 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68 61  ll pages must ha
6970: 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ve at least one 
6980: 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72  cell, except for
6990: 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20   root pages */. 
69a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
69b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
69c0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
69d0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
69e0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
69f0: 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32  e */.  pc = get2
6a00: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
6a10: 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61  ]);.  nFree = da
6a20: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20  ta[hdr+7] + top 
6a30: 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  - (cellOffset + 
6a40: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  2*pPage->nCell);
6a50: 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29  .  while( pc>0 )
6a60: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20  {.    int next, 
6a70: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
6a80: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b  >usableSize-4 ){
6a90: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
6aa0: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
6ab0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  page */.      re
6ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6ad0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
6ae0: 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32  .    next = get2
6af0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
6b00: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
6b10: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
6b20: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e  );.    if( next>
6b30: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
6b40: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze+3 ){.      /*
6b50: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
6b60: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
6b70: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
6b80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6b90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
6ba0: 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d    }.    nFree +=
6bb0: 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20   size;.    pc = 
6bc0: 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67  next;.  }.  pPag
6bd0: 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65  e->nFree = nFree
6be0: 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75  ;.  if( nFree>=u
6bf0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
6c00: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
6c10: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
6c20: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
6c30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6c40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
6c50: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 2d 3e 69  .  }..  pPage->i
6c60: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  sInit = 1;.  ret
6c70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6c80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
6c90: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
6ca0: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
6cb0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
6cc0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
6cd0: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
6ce0: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
6cf0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
6d00: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
6d10: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
6d20: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
6d30: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
6d40: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
6d50: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
6d60: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
6d70: 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  nt first;..  ass
6d80: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
6d90: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
6da0: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
6db0: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
6dc0: 73 65 72 74 28 20 26 64 61 74 61 5b 70 42 74 2d  sert( &data[pBt-
6dd0: 3e 70 61 67 65 53 69 7a 65 5d 20 3d 3d 20 28 75  >pageSize] == (u
6de0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50  nsigned char*)pP
6df0: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
6e00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
6e10: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
6e20: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 6d 65  pDbPage) );.  me
6e30: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
6e40: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
6e50: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61  ize - hdr);.  da
6e60: 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b  ta[hdr] = flags;
6e70: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
6e80: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
6e90: 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20  TF_LEAF)==0);.  
6ea0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
6eb0: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
6ec0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
6ed0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6ee0: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
6ef0: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
6f00: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  e->nFree = pBt->
6f10: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
6f20: 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  st;.  decodeFlag
6f30: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
6f40: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
6f50: 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61  set = hdr;.  pPa
6f60: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
6f70: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
6f80: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
6f90: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
6fa0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  t = 0;.  pPage->
6fb0: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
6fc0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
6fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
6fe0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
6ff0: 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
7000: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
7010: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
7020: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
7030: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   needed..**.** I
7040: 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  f the noContent 
7050: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
7060: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
7070: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
7080: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
7090: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
70a0: 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
70b0: 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
70c0: 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
70d0: 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
70e0: 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
70f0: 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
7100: 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
7110: 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
7120: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
7130: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
7140: 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
7150: 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
7160: 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
7170: 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
7180: 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
7190: 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
71a0: 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
71b0: 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  int..*/.int sqli
71c0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
71d0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
71e0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
71f0: 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
7200: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
7210: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
7220: 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
7230: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
7240: 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
7250: 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
7260: 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
7270: 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
7280: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
7290: 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65   load page conte
72a0: 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  nt if true */.){
72b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
72c0: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44  Page *pPage;.  D
72d0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
72e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
72f0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
7300: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
7310: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
7320: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
7330: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7340: 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28   rc;.  pPage = (
7350: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
7360: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
7370: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
7380: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
7390: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
73a0: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
73b0: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
73c0: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
73d0: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
73e0: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
73f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
7400: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
7410: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a  1 ? 100 : 0;.  *
7420: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
7430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7440: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  OK;.}../*.** Get
7450: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
7460: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
7470: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
7480: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
7490: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
74a0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
74b0: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
74c0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
74d0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73  eGetPage() and s
74e0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
74f0: 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
7500: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
7510: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
7520: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
7530: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
7540: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
7550: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
7560: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
7570: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
7580: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
7590: 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ,    /* Write th
75a0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
75b0: 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ere */.  MemPage
75c0: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 2f 2a   *pParent     /*
75d0: 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70   Parent of the p
75e0: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
75f0: 72 63 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  rc;.  if( pgno==
7600: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7610: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7620: 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d  KPT; .  }.  rc =
7630: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
7640: 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
7650: 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  ppPage, 0);.  if
7660: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7670: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
7680: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Init==0 ){.    r
7690: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
76a0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
76b0: 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
76c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
76d0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
76e0: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
76f0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
7700: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
7710: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
7720: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
7730: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
7740: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
7750: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
7760: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
7770: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7780: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
7790: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
77a0: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
77b0: 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
77c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
77d0: 69 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20  ize]==(unsigned 
77e0: 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20  char*)pPage );. 
77f0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
7800: 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
7810: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
7820: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7830: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
7840: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7850: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  nt for a page.**
7860: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
7870: 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66  We need to unref
7880: 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69   the pParent poi
7890: 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a  nter when that.*
78a0: 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74  * happens..*/.st
78b0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44 65  atic void pageDe
78c0: 73 74 72 75 63 74 6f 72 28 44 62 50 61 67 65 20  structor(DbPage 
78d0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
78e0: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
78f0: 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
7900: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
7910: 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  )==0 );.  pPage 
7920: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
7930: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7940: 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  a(pData);.  if( 
7950: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29  pPage->pParent )
7960: 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
7970: 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
7980: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 50 61  pParent;.    pPa
7990: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
79a0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
79b0: 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  (pParent);.  }. 
79c0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
79d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72   0;.}../*.** Dur
79e0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
79f0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
7a00: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
7a10: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
7a20: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
7a30: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
7a40: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
7a50: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
7a60: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
7a70: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
7a80: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
7a90: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
7aa0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
7ab0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
7ac0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
7ad0: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
7ae0: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
7af0: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
7b00: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
7b10: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
7b20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7b30: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
7b40: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67   *pData, int pag
7b50: 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67  eSize){.  MemPag
7b60: 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
7b70: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
7b80: 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  7)==0 );.  pPage
7b90: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
7ba0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
7bb0: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
7bc0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
7bd0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
7be0: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nit = 0;.    sql
7bf0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
7c00: 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
7c10: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
7c20: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
7c30: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
7c40: 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
7c50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7c60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
7c70: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
7c80: 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64   NULL.** a new d
7c90: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72  atabase with a r
7ca0: 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72  andom name is cr
7cb0: 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e  eated.  This ran
7cc0: 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64  domly named.** d
7cd0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
7ce0: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
7cf0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
7d00: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
7d10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7d20: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
7d30: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
7d40: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
7d50: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
7d60: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
7d70: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7d80: 65 33 20 2a 70 53 71 6c 69 74 65 2c 20 20 20 20  e3 *pSqlite,    
7d90: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
7da0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7db0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
7dc0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
7dd0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
7de0: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
7df0: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
7e00: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
7e10: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
7e20: 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
7e30: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
7e40: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
7e50: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
7e60: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
7e70: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
7e80: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
7e90: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
7ea0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7eb0: 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  int nReserve;.  
7ec0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
7ed0: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 23 69  bHeader[100];.#i
7ee0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7ef0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
7f00: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
7f10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
7f20: 4b 49 4f 29 0a 20 20 63 6f 6e 73 74 20 54 68 72  KIO).  const Thr
7f30: 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 3b  eadData *pTsdro;
7f40: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
7f50: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
7f60: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
7f70: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
7f80: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
7f90: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
7fa0: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
7fb0: 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20  se. This symbol 
7fc0: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
7fd0: 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20   if.  ** either 
7fe0: 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  of the shared-da
7ff0: 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d  ta or autovacuum
8000: 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f   features are co
8010: 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74  mpiled .  ** int
8020: 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20  o the library.. 
8030: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
8040: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
8050: 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64  RED_CACHE) || !d
8060: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8070: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20  IT_AUTOVACUUM). 
8080: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
8090: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
80a0: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
80b0: 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a  db = 0;.  #else.
80c0: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
80d0: 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  Memdb = zFilenam
80e0: 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69  e && !strcmp(zFi
80f0: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
8100: 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65  :");.  #endif.#e
8110: 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73 71 6c 69  ndif..  p = sqli
8120: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
8130: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
8140: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
8150: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8160: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
8170: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
8180: 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53 71 6c  ->pSqlite = pSql
8190: 69 74 65 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  ite;..  /* Try t
81a0: 6f 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  o find an existi
81b0: 6e 67 20 42 74 72 65 65 20 73 74 72 75 63 74 75  ng Btree structu
81c0: 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20 7a 46 69  re opened on zFi
81d0: 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66 20 21  lename. */.#if !
81e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
81f0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
8200: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
8210: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
8220: 29 0a 20 20 70 54 73 64 72 6f 20 3d 20 73 71 6c  ).  pTsdro = sql
8230: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
8240: 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20  adOnly();.  if( 
8250: 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65  pTsdro->useShare
8260: 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61  dData && zFilena
8270: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
8280: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c  {.    char *zFul
8290: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
82a0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
82b0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
82c0: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
82d0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  name ){.      sq
82e0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20  liteFree(p);.   
82f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8300: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
8310: 20 20 66 6f 72 28 70 42 74 3d 70 54 73 64 72 6f    for(pBt=pTsdro
8320: 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70  ->pBtree; pBt; p
8330: 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
8340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
8350: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
8360: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
8370: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
8380: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
8390: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
83a0: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )) ){.        p-
83b0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
83c0: 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70      *ppBtree = p
83d0: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
83e0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Ref++;.        s
83f0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
8400: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
8410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8420: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
8430: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
8440: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
8450: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
8460: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
8470: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
8480: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
8490: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
84a0: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 2a  he btree are.  *
84b0: 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
84c0: 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
84d0: 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
84e0: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
84f0: 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65 6e 20 63  sult.  ** when c
8500: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
8510: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
8520: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ture..  */.  ass
8530: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
8540: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
8550: 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  4)==4 );.  asser
8560: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
8570: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
8580: 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==4 );.  assert(
8590: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
85a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
85b0: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
85c0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
85d0: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20 70  Pgno)==4 );..  p
85e0: 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Bt = sqliteMallo
85f0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  c( sizeof(*pBt) 
8600: 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  );.  if( pBt==0 
8610: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
8620: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
8630: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
8640: 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
8650: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 26  lite3PagerOpen(&
8660: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
8670: 6c 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49  lename, EXTRA_SI
8680: 5a 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ZE, flags);.  if
8690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
86a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
86b0: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
86c0: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
86d0: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
86e0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
86f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
8700: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8710: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
8720: 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42  out;.  }.  p->pB
8730: 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69  t = pBt;..  sqli
8740: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
8750: 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65  uctor(pBt->pPage
8760: 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  r, pageDestructo
8770: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  r);.  sqlite3Pag
8780: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
8790: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
87a0: 65 69 6e 69 74 29 3b 0a 20 20 70 42 74 2d 3e 70  einit);.  pBt->p
87b0: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 42  Cursor = 0;.  pB
87c0: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
87d0: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
87e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
87f0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
8800: 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  ger);.  pBt->pag
8810: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
8820: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
8830: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
8840: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
8850: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
8860: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
8870: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
8880: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
8890: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
88a0: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  {.    pBt->pageS
88b0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
88c0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
88d0: 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65      pBt->maxEmbe
88e0: 64 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a  dFrac = 64;   /*
88f0: 20 32 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d   25% */.    pBt-
8900: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
8910: 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a  32;   /* 12.5% *
8920: 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  /.    pBt->minLe
8930: 61 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20  afFrac = 32;    
8940: 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e  /* 12.5% */.#ifn
8950: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8960: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f  AUTOVACUUM.    /
8970: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
8980: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
8990: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
89a0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
89b0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 6c 65  , then.    ** le
89c0: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
89d0: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
89e0: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
89f0: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a  ), even if.    *
8a00: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
8a10: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
8a20: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
8a30: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 2a  r hand, if.    *
8a40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
8a50: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
8a60: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
8a70: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
8a80: 20 61 0a 20 20 20 20 2a 2a 20 72 65 67 75 6c 61   a.    ** regula
8a90: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
8aa0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
8ab0: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
8ac0: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
8ad0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8ae0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
8af0: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 70  Memdb ){.      p
8b00: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
8b10: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
8b20: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
8b30: 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  : 0);.      pBt-
8b40: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
8b50: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
8b60: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
8b70: 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  : 0);.    }.#end
8b80: 69 66 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  if.    nReserve 
8b90: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
8ba0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
8bb0: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
8bc0: 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61  pBt->maxEmbedFra
8bd0: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31  c = zDbHeader[21
8be0: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45  ];.    pBt->minE
8bf0: 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65  mbedFrac = zDbHe
8c00: 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 70 42  ader[22];.    pB
8c10: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d  t->minLeafFrac =
8c20: 20 7a 44 62 48 65 61 64 65 72 5b 32 33 5d 3b 0a   zDbHeader[23];.
8c30: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
8c40: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
8c50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8c60: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
8c70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
8c80: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
8c90: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
8ca0: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
8cb0: 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  }.  pBt->usableS
8cc0: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
8cd0: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
8ce0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
8cf0: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
8d00: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
8d10: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
8d20: 53 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Size */.  sqlite
8d30: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
8d40: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
8d50: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
8d60: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8d70: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
8d80: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
8d90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
8da0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 41 64 64 20  ISKIO).  /* Add 
8db0: 74 68 65 20 6e 65 77 20 62 74 72 65 65 20 74 6f  the new btree to
8dc0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
8dd0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 54 68 72   starting at Thr
8de0: 65 61 64 44 61 74 61 2e 70 42 74 72 65 65 2e 0a  eadData.pBtree..
8df0: 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    ** There is no
8e00: 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 6d   chance that a m
8e10: 61 6c 6c 6f 63 28 29 20 6d 61 79 20 66 61 69 6c  alloc() may fail
8e20: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 0a   inside of the .
8e30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 54 68 72 65    ** sqlite3Thre
8e40: 61 64 44 61 74 61 28 29 20 63 61 6c 6c 2c 20 61  adData() call, a
8e50: 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  s the ThreadData
8e60: 20 73 74 72 75 63 74 75 72 65 20 6d 75 73 74 20   structure must 
8e70: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
8e80: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
8e90: 20 66 6f 72 20 70 54 73 64 72 6f 2d 3e 75 73 65   for pTsdro->use
8ea0: 53 68 61 72 65 64 44 61 74 61 20 74 6f 20 62 65  SharedData to be
8eb0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2f 0a   non-zero..  */.
8ec0: 20 20 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73    if( pTsdro->us
8ed0: 65 53 68 61 72 65 64 44 61 74 61 20 26 26 20 7a  eSharedData && z
8ee0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
8ef0: 65 6d 64 62 20 29 7b 0a 20 20 20 20 70 42 74 2d  emdb ){.    pBt-
8f00: 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 72 6f 2d  >pNext = pTsdro-
8f10: 3e 70 42 74 72 65 65 3b 0a 20 20 20 20 73 71 6c  >pBtree;.    sql
8f20: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
8f30: 2d 3e 70 42 74 72 65 65 20 3d 20 70 42 74 3b 0a  ->pBtree = pBt;.
8f40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
8f50: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 2a 70  ->nRef = 1;.  *p
8f60: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
8f70: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
8f80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8f90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
8fa0: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
8fb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
8fc0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
8fd0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
8fe0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74    sqliteFree(pBt
8ff0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
9000: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
9010: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ee = 0;.  }.  re
9020: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9030: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
9040: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
9050: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
9060: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
9070: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
9080: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
9090: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
90a0: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
90b0: 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Cur;..#ifndef SQ
90c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
90d0: 5f 43 41 43 48 45 0a 20 20 54 68 72 65 61 64 44  _CACHE.  ThreadD
90e0: 61 74 61 20 2a 70 54 73 64 3b 0a 23 65 6e 64 69  ata *pTsd;.#endi
90f0: 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  f..  /* Close al
9100: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
9110: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
9120: 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 70  .  */.  pCur = p
9130: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
9140: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
9150: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
9160: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
9170: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
9180: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
9190: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
91a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
91b0: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
91c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
91d0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
91e0: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
91f0: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
9200: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
9210: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
9220: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
9230: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
9240: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
9250: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
9260: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
9270: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
9280: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
9290: 46 72 65 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65  Free(p);..#ifnde
92a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
92b0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
92c0: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
92d0: 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
92e0: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
92f0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
9300: 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
9310: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
9320: 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
9330: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
9340: 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
9350: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
9360: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9370: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
9380: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
9390: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 20 29   if( pBt->nRef )
93a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
93b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
93c0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
93d0: 72 65 64 2d 62 74 72 65 65 20 66 72 6f 6d 20 74  red-btree from t
93e0: 68 65 20 74 68 72 65 61 64 20 77 69 64 65 20 6c  he thread wide l
93f0: 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20 2a 2a 20  ist. Call .  ** 
9400: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
9410: 6c 79 28 29 20 61 6e 64 20 74 68 65 6e 20 63 61  ly() and then ca
9420: 73 74 20 61 77 61 79 20 74 68 65 20 63 6f 6e 73  st away the cons
9430: 74 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  t property of th
9440: 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  e .  ** pointer 
9450: 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f 63 61 74  to avoid allocat
9460: 69 6e 67 20 74 68 72 65 61 64 20 64 61 74 61 20  ing thread data 
9470: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72 65 61  if it is not rea
9480: 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 20 20  lly required..  
9490: 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28 54 68 72  */.  pTsd = (Thr
94a0: 65 61 64 44 61 74 61 20 2a 29 73 71 6c 69 74 65  eadData *)sqlite
94b0: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
94c0: 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54 73  nly();.  if( pTs
94d0: 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 20 29  d->pBtree==pBt )
94e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
94f0: 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61  sd==sqlite3Threa
9500: 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 70  dData() );.    p
9510: 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20 70 42  Tsd->pBtree = pB
9520: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  t->pNext;.  }els
9530: 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  e{.    BtShared 
9540: 2a 70 50 72 65 76 3b 0a 20 20 20 20 66 6f 72 28  *pPrev;.    for(
9550: 70 50 72 65 76 3d 70 54 73 64 2d 3e 70 42 74 72  pPrev=pTsd->pBtr
9560: 65 65 3b 20 70 50 72 65 76 20 26 26 20 70 50 72  ee; pPrev && pPr
9570: 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74 3b 20  ev->pNext!=pBt; 
9580: 70 50 72 65 76 3d 70 50 72 65 76 2d 3e 70 4e 65  pPrev=pPrev->pNe
9590: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 50  xt){}.    if( pP
95a0: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rev ){.      ass
95b0: 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74  ert( pTsd==sqlit
95c0: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 29  e3ThreadData() )
95d0: 3b 0a 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70  ;.      pPrev->p
95e0: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
95f0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
9600: 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  dif..  /* Close 
9610: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 66 72  the pager and fr
9620: 65 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ee the shared-bt
9630: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
9640: 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
9650: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71  >pCursor );.  sq
9660: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
9670: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
9680: 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
9690: 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
96a0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
96b0: 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
96c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
96d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74    sqliteFree(pBt
96e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
96f0: 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20  liteFree(pBt);. 
9700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9710: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
9720: 67 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ge the busy hand
9730: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ler callback fun
9740: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
9750: 6c 69 74 65 33 42 74 72 65 65 53 65 74 42 75 73  lite3BtreeSetBus
9760: 79 48 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a  yHandler(Btree *
9770: 70 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  p, BusyHandler *
9780: 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53  pHandler){.  BtS
9790: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
97a0: 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70 42 75 73  pBt;.  pBt->pBus
97b0: 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e 64  yHandler = pHand
97c0: 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ler;.  sqlite3Pa
97d0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
97e0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
97f0: 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72 65 74 75  Handler);.  retu
9800: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9810: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
9820: 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
9830: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
9840: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
9850: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
9860: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
9870: 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
9880: 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
9890: 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
98a0: 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
98b0: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
98c0: 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
98d0: 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
98e0: 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
98f0: 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
9900: 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
9910: 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
9920: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
9930: 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
9940: 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
9950: 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
9960: 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
9970: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
9980: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
9990: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
99a0: 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
99b0: 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
99c0: 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
99d0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
99e0: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
99f0: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
9a00: 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
9a10: 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
9a20: 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
9a30: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
9a40: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
9a50: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
9a60: 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
9a70: 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
9a80: 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
9a90: 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
9aa0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
9ab0: 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
9ac0: 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
9ad0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
9ae0: 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
9af0: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
9b00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
9b10: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
9b20: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
9b30: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
9b40: 20 6d 78 50 61 67 65 29 3b 0a 20 20 72 65 74 75   mxPage);.  retu
9b50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9b60: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
9b70: 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
9b80: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
9b90: 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
9ba0: 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
9bb0: 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
9bc0: 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
9bd0: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
9be0: 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
9bf0: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
9c00: 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
9c10: 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
9c20: 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
9c30: 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
9c40: 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
9c50: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
9c60: 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
9c70: 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
9c80: 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
9c90: 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
9ca0: 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
9cb0: 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
9cc0: 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
9cd0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
9ce0: 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
9cf0: 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
9d00: 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
9d10: 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
9d20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9d30: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
9d40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
9d50: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
9d60: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65  Btree *p, int le
9d70: 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e  vel, int fullSyn
9d80: 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  c){.  BtShared *
9d90: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
9da0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
9db0: 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
9dc0: 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
9dd0: 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 72 65 74 75  ullSync);.  retu
9de0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9df0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
9e00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
9e10: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
9e20: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
9e30: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
9e40: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
9e50: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
9e60: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
9e70: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
9e80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
9e90: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
9ea0: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
9eb0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
9ec0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  t;.  assert( pBt
9ed0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
9ee0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
9ef0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
9f00: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
9f10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9f20: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
9f30: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
9f40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9f50: 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68  VACUUM)./*.** Ch
9f60: 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
9f70: 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
9f80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
9f90: 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
9fa0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
9fb0: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
9fc0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
9fd0: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
9fe0: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
9ff0: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
a000: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
a010: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
a020: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
a030: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
a040: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
a050: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
a060: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
a070: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
a080: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
a090: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
a0a0: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
a0b0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
a0c0: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
a0d0: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
a0e0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
a0f0: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
a100: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
a110: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
a120: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
a130: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
a140: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
a150: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
a160: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
a170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
a180: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
a190: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
a1a0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
a1b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
a1c0: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
a1d0: 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
a1e0: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
a1f0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
a200: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
a210: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
a220: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
a230: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a240: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
a250: 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
a260: 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
a270: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
a280: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
a290: 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
a2a0: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
a2b0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a2c0: 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
a2d0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
a2e0: 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
a2f0: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
a300: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
a310: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
a320: 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
a330: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
a340: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73  Bt->pageSize = s
a350: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a360: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
a370: 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  er, pageSize);. 
a380: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
a390: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
a3a0: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
a3b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a3c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
a3d0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
a3e0: 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
a3f0: 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
a400: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
a410: 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
a420: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
a430: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20  pageSize;.}.int 
a440: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
a450: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
a460: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
a470: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
a480: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
a4a0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
a4b0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
a4c0: 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
a4d0: 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
a4e0: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
a4f0: 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
a500: 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
a510: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
a520: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
a530: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
a540: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
a550: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
a560: 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
a570: 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
a580: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74  t mxPage){.  ret
a590: 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
a5a0: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
a5b0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
a5c0: 61 67 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  age);.}.#endif /
a5d0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
a5e0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
a5f0: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
a600: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
a610: 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
a620: 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
a630: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
a640: 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
a650: 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
a660: 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
a670: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
a680: 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
a690: 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
a6a0: 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
a6b0: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
a6c0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
a6d0: 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
a6e0: 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
a6f0: 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
a700: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
a710: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
a720: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
a730: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
a740: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
a750: 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
a760: 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
a770: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
a780: 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
a790: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
a7a0: 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
a7b0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
a7c0: 74 20 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75  t av = (autoVacu
a7d0: 75 6d 3f 31 3a 30 29 3b 0a 20 20 69 6e 74 20 69  um?1:0);.  int i
a7e0: 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3d  v = (autoVacuum=
a7f0: 3d 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  =BTREE_AUTOVACUU
a800: 4d 5f 49 4e 43 52 3f 31 3a 30 29 3b 0a 20 20 69  M_INCR?1:0);.  i
a810: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
a820: 46 69 78 65 64 20 26 26 20 61 76 21 3d 70 42 74  Fixed && av!=pBt
a830: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
a840: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a850: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
a860: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
a870: 6d 20 3d 20 61 76 3b 0a 20 20 70 42 74 2d 3e 69  m = av;.  pBt->i
a880: 6e 63 72 56 61 63 75 75 6d 20 3d 20 69 76 3b 0a  ncrVacuum = iv;.
a890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a8a0: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  OK;.#endif.}../*
a8b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
a8c0: 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
a8d0: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
a8e0: 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
a8f0: 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
a900: 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
a910: 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
a920: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
a930: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
a940: 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
a950: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a960: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
a970: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
a980: 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
a990: 72 65 74 75 72 6e 20 28 0a 20 20 20 20 28 21 70  return (.    (!p
a9a0: 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
a9b0: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
a9c0: 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
a9d0: 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
a9e0: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
a9f0: 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
aa00: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
aa10: 49 4e 43 52 0a 20 20 29 3b 0a 23 65 6e 64 69 66  INCR.  );.#endif
aa20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
aa30: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
aa40: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
aa50: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
aa60: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
aa70: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
aa80: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
aa90: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
aaa0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
aab0: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
aac0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
aad0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
aae0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
aaf0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
ab00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
ab10: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
ab20: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
ab30: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
ab40: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
ab50: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
ab60: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
ab70: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
ab80: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
ab90: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
aba0: 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65 53  .  int rc, pageS
abb0: 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ize;.  MemPage *
abc0: 70 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70 42  pPage1;.  if( pB
abd0: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
abe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
abf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
ac00: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
ac10: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
ac20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ac30: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
ac40: 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20   ..  /* Do some 
ac50: 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
ac60: 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
ac70: 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
ac80: 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
ac90: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
aca0: 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51   .  */.  rc = SQ
acb0: 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69  LITE_NOTADB;.  i
acc0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
acd0: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
ace0: 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 75  ager)>0 ){.    u
acf0: 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
ad00: 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  1->aData;.    if
ad10: 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
ad20: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
ad30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
ad40: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
ad50: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
ad60: 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
ad70: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
ad80: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
ad90: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
ada0: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
adb0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
adc0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
add0: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
ade0: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
adf0: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
ae00: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
ae10: 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65  )!=0 || pageSize
ae20: 3c 35 31 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  <512 ){.      go
ae30: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
ae40: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
ae50: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
ae60: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
ae70: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
ae80: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
ae90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
aea0: 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
aeb0: 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
aec0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 35  Bt->usableSize<5
aed0: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
aee0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
aef0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
af00: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
af10: 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a 20 20 20  = page1[21];.   
af20: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
af30: 61 63 20 3d 20 70 61 67 65 31 5b 32 32 5d 3b 0a  ac = page1[22];.
af40: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
af50: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 33 5d  Frac = page1[23]
af60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
af70: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
af80: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
af90: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
afa0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
afb0: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
afc0: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
afd0: 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
afe0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
aff0: 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
b000: 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
b010: 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
b020: 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
b030: 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
b040: 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
b050: 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
b060: 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
b070: 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
b080: 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
b090: 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
b0a0: 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
b0b0: 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
b0c0: 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
b0d0: 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
b0e0: 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
b0f0: 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
b100: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
b110: 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
b120: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
b130: 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
b140: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
b150: 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
b160: 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
b170: 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
b180: 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
b190: 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
b1a0: 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
b1b0: 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
b1c0: 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
b1d0: 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
b1e0: 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
b1f0: 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
b200: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
b210: 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
b220: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
b230: 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 61  Size-12)*pBt->ma
b240: 78 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d  xEmbedFrac/255 -
b250: 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
b260: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
b270: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
b280: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 2f 32 35  >minEmbedFrac/25
b290: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
b2a0: 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
b2b0: 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
b2c0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
b2d0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
b2e0: 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61  -12)*pBt->minLea
b2f0: 66 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  fFrac/255 - 23;.
b300: 20 20 69 66 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f    if( pBt->minLo
b310: 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  cal>pBt->maxLoca
b320: 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  l || pBt->maxLoc
b330: 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  al<0 ){.    goto
b340: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
b350: 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ed;.  }.  assert
b360: 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
b370: 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
b380: 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
b390: 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
b3a0: 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
b3b0: 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
b3c0: 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
b3d0: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
b3e0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
b3f0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
b400: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
b410: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
b420: 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ike lockBtree() 
b430: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61  except that it a
b440: 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  lso invokes the.
b450: 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ** busy callback
b460: 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63   if there is loc
b470: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f  k contention..*/
b480: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
b490: 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42  BtreeWithRetry(B
b4a0: 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69  tree *pRef){.  i
b4b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b4c0: 4b 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69  K;.  if( pRef->i
b4d0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
b4e0: 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54  NE ){.    u8 inT
b4f0: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65  ransaction = pRe
b500: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
b510: 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65  ction;.    btree
b520: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
b530: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b540: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
b550: 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70  (pRef, 0);.    p
b560: 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
b570: 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e  saction = inTran
b580: 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65  saction;.    pRe
b590: 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  f->inTrans = TRA
b5a0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28  NS_NONE;.    if(
b5b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b5c0: 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42  {.      pRef->pB
b5d0: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
b5e0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  -;.    }.    btr
b5f0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
b600: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b610: 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f  rc;.}.       ../
b620: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
b630: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
b640: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
b650: 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
b660: 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
b670: 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
b680: 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
b690: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
b6a0: 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
b6b0: 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
b6c0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
b6d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
b6e0: 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
b6f0: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
b700: 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
b710: 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
b720: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
b730: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
b740: 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ors, this routin
b750: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
b760: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
b770: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
b780: 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
b790: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
b7a0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
b7b0: 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
b7c0: 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
b7d0: 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74  *pBt){.  if( pBt
b7e0: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
b7f0: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
b800: 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26  Bt->pCursor==0 &
b810: 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
b820: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
b830: 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
b840: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31  (pBt->pPager)>=1
b850: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42   ){.      if( pB
b860: 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
b870: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  ==0 ){.        M
b880: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
b890: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
b8a0: 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74       pPage->aDat
b8b0: 61 20 3d 20 26 28 28 75 38 2a 29 70 50 61 67 65  a = &((u8*)pPage
b8c0: 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
b8d0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ];.        pPage
b8e0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
b8f0: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
b900: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
b910: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
b920: 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
b930: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61    }.    pBt->pPa
b940: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
b950: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
b960: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
b970: 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
b980: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
b990: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
b9a0: 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a  of the.** file..
b9b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
b9c0: 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
b9d0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
b9e0: 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
b9f0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
ba00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
ba10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
ba20: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
ba30: 65 72 29 3e 30 20 29 20 72 65 74 75 72 6e 20 53  er)>0 ) return S
ba40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20  QLITE_OK;.  pP1 
ba50: 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
ba60: 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
ba70: 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
ba80: 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
ba90: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
baa0: 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
bab0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
bac0: 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
bad0: 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
bae0: 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
baf0: 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
bb00: 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
bb10: 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
bb20: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
bb30: 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
bb40: 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
bb50: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
bb60: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d   = 1;.  data[20]
bb70: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
bb80: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
bb90: 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  ze;.  data[21] =
bba0: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
bbb0: 61 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  ac;.  data[22] =
bbc0: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
bbd0: 61 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  ac;.  data[23] =
bbe0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
bbf0: 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  c;.  memset(&dat
bc00: 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
bc10: 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
bc20: 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
bc30: 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
bc40: 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
bc50: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
bc60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bc70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
bc80: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
bc90: 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
bca0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
bcb0: 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
bcc0: 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
bcd0: 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
bce0: 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
bcf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bd00: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
bd10: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
bd20: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
bd30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
bd40: 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
bd50: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
bd60: 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
bd70: 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
bd80: 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
bd90: 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
bda0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
bdb0: 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
bdc0: 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
bdd0: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
bde0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
bdf0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
be00: 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
be10: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
be20: 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
be30: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
be40: 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
be50: 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
be60: 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
be70: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
be80: 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
be90: 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
bea0: 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
beb0: 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
bec0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
bed0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
bee0: 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
bef0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
bf00: 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
bf10: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
bf20: 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
bf30: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
bf40: 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
bf50: 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
bf60: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
bf70: 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
bf80: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
bf90: 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
bfa0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
bfb0: 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
bfc0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
bfd0: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
bfe0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
bff0: 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
c000: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
c010: 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
c020: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
c030: 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
c040: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
c050: 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
c060: 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
c070: 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
c080: 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
c090: 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
c0a0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
c0b0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
c0c0: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
c0d0: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
c0e0: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
c0f0: 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
c100: 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
c110: 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
c120: 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
c130: 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
c140: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
c150: 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
c160: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
c170: 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
c180: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
c190: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
c1a0: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
c1b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
c1c0: 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
c1d0: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
c1e0: 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
c1f0: 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
c200: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
c210: 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
c220: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
c230: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
c240: 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
c250: 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
c260: 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
c270: 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
c280: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
c290: 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
c2a0: 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
c2b0: 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
c2c0: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
c2d0: 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
c2e0: 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
c2f0: 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
c300: 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
c310: 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
c320: 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
c330: 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
c340: 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
c350: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
c360: 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
c370: 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
c380: 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
c390: 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
c3a0: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
c3b0: 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
c3c0: 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
c3d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
c3e0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
c3f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 62   SQLITE_OK;..  b
c400: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
c410: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
c420: 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
c430: 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
c440: 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
c450: 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
c460: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
c470: 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
c480: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
c490: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
c4a0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
c4b0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
c4c0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
c4d0: 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
c4e0: 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
c4f0: 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
c500: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c510: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
c520: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
c530: 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
c540: 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
c550: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
c560: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
c570: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
c580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
c590: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  ADONLY;.  }..  /
c5a0: 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
c5b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
c5c0: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
c5d0: 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
c5e0: 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
c5f0: 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
c600: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
c610: 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
c620: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
c630: 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
c640: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
c650: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   */.  if( pBt->i
c660: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
c670: 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66  ANS_WRITE && wrf
c680: 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
c690: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
c6a0: 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69   }..  do {.    i
c6b0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
c6c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c6d0: 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a  lockBtree(pBt);.
c6e0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
c6f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c700: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
c710: 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
c720: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
c730: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
c740: 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
c750: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c760: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
c770: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
c780: 61 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  age, wrflag>1);.
c790: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
c7a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c7b0: 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
c7c0: 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
c7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c7e0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
c7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c800: 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  {.      if( wrfl
c810: 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ag ) pBt->inStmt
c820: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
c830: 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
c840: 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
c850: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
c860: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
c870: 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
c880: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
c890: 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
c8a0: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
c8b0: 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 42  yHandler(pBt->pB
c8c0: 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 0a  usyHandler) );..
c8d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c8e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
c8f0: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
c900: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
c910: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
c920: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ++;.    }.    p-
c930: 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
c940: 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
c950: 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
c960: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
c970: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
c980: 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
c990: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
c9a0: 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
c9b0: 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  }.  }..  btreeIn
c9c0: 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65  tegrity(p);.  re
c9d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
c9e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c9f0: 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
ca00: 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
ca10: 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
ca20: 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
ca30: 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
ca40: 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
ca50: 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
ca60: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
ca70: 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
ca80: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
ca90: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
caa0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
cab0: 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
cac0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
cad0: 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
cae0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
caf0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
cb20: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
cb30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cb50: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
cb60: 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
cb70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
cb80: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
cb90: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
cba0: 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
cbb0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
cbc0: 70 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69  pBt;.  int isIni
cbd0: 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
cbe0: 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
cbf0: 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
cc00: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
cc10: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
cc20: 20 30 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70   0);.  nCell = p
cc30: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
cc40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
cc50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
cc60: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
cc70: 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
cc80: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
cc90: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
cca0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
ccb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ccc0: 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
ccd0: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
cce0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
ccf0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
cd00: 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
cd10: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
cd20: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
cd30: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
cd40: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
cd50: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
cd60: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
cd70: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
cd80: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
cd90: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ps_out;.    }.  
cda0: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
cdb0: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
cdc0: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
cdd0: 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
cde0: 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
cdf0: 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72  ffset+8]);.    r
ce00: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
ce10: 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
ce20: 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
ce30: 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
ce40: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
ce50: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
ce60: 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
ce70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ce80: 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
ce90: 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20  pPage, which is 
cea0: 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
ceb0: 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e   a btree page, n
cec0: 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  ot an overflow.*
ced0: 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69  * page, is a poi
cee0: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
cef0: 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20  om. Modify this 
cf00: 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
cf10: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
cf20: 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
cf30: 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
cf40: 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
cf50: 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  er to be modifie
cf60: 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  d, as .** follow
cf70: 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
cf80: 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
cf90: 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
cfa0: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
cfb0: 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
cfc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
cfd0: 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
cfe0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
cff0: 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
d000: 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
d010: 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
d020: 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
d030: 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
d040: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
d050: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
d060: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
d070: 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
d080: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
d090: 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
d0a0: 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
d0b0: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
d0c0: 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
d0f0: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
d100: 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
d110: 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
d120: 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
d130: 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
d140: 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 69 66   u8 eType){.  if
d150: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
d160: 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
d170: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
d180: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
d190: 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
d1a0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
d1b0: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
d1c0: 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
d1d0: 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
d1e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d1f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d200: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
d210: 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
d220: 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
d230: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49  lse{.    int isI
d240: 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
d250: 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
d260: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
d270: 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  l;..    sqlite3B
d280: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d290: 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
d2a0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
d2b0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
d2c0: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
d2d0: 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
d2e0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
d2f0: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
d300: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
d310: 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
d320: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
d330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d340: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
d350: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
d360: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
d370: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
d380: 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
d390: 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
d3a0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
d3b0: 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
d3c0: 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
d3d0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
d3e0: 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
d3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
d400: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
d410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d430: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
d440: 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
d450: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
d460: 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
d470: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d490: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
d4a0: 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
d4b0: 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
d4c0: 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
d4d0: 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
d4e0: 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
d4f0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
d500: 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
d510: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d520: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d530: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
d540: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
d550: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
d560: 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
d570: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
d580: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
d590: 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
d5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d5b0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
d5c0: 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
d5d0: 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
d5e0: 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
d5f0: 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
d600: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
d610: 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
d620: 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
d630: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d640: 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
d650: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
d660: 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
d670: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
d680: 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
d690: 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
d6a0: 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
d6b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
d6c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
d6d0: 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
d6e0: 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
d6f0: 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
d700: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d710: 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
d720: 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
d730: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
d740: 65 65 50 61 67 65 20 20 20 20 20 20 20 20 20 20  eePage          
d750: 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
d760: 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
d770: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50   to */.){.  MemP
d780: 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
d790: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
d7a0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
d7b0: 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
d7c0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
d7d0: 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
d7e0: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
d7f0: 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
d800: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
d810: 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
d820: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
d830: 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
d840: 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
d850: 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
d860: 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
d870: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
d880: 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  E );..  /* Move 
d890: 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
d8a0: 6d 20 69 74 27 73 20 63 75 72 72 65 6e 74 20 6c  m it's current l
d8b0: 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
d8c0: 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
d8d0: 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
d8e0: 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
d8f0: 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
d900: 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
d910: 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
d920: 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
d930: 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
d940: 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
d950: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
d960: 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
d970: 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
d980: 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
d990: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d9a0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
d9b0: 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
d9c0: 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
d9d0: 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
d9e0: 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
d9f0: 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
da00: 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
da10: 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
da20: 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
da30: 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
da40: 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
da50: 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
da60: 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
da70: 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
da80: 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
da90: 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
daa0: 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
dab0: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
dac0: 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
dad0: 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
dae0: 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
daf0: 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
db00: 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
db10: 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
db20: 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
db30: 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
db40: 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
db50: 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
db60: 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
db70: 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
db80: 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
db90: 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
dba0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
dbb0: 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
dbc0: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
dbd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dbe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dbf0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
dc00: 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
dc10: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
dc20: 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
dc30: 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
dc40: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
dc50: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
dc60: 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
dc70: 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
dc80: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
dc90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dca0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
dcb0: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
dcc0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
dcd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
dce0: 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
dcf0: 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
dd00: 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
dd10: 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
dd20: 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
dd30: 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
dd40: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
dd50: 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
dd60: 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
dd70: 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
dd80: 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
dd90: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
dda0: 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
ddb0: 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
ddc0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
ddd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
dde0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ddf0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
de00: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
de10: 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
de20: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
de30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
de40: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
de50: 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
de60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
de70: 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
de80: 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
de90: 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
dea0: 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
deb0: 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
dec0: 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
ded0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dee0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
def0: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
df00: 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
df10: 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20  e, iPtrPage);.  
df20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
df30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
df40: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
df50: 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
df60: 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
df70: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
df80: 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
df90: 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
dfa0: 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
dfb0: 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
dfc0: 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
dfd0: 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
dfe0: 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
dff0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
e000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e010: 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
e020: 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
e030: 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
e040: 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
e050: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
e060: 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
e070: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
e080: 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
e090: 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
e0a0: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
e0b0: 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
e0c0: 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
e0d0: 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
e0e0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
e0f0: 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
e100: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
e110: 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
e120: 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
e130: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
e140: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
e150: 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61  n assumes.** tha
e160: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  t the caller wil
e170: 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
e180: 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
e190: 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75  until.** it retu
e1a0: 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
e1b0: 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  or an error, and
e1c0: 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68   that nFin is th
e1d0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70  e.** number of p
e1e0: 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ages the databas
e1f0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74  e file will cont
e200: 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a  ain after this .
e210: 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f  ** process is co
e220: 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  mplete..*/.stati
e230: 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
e240: 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
e250: 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a  Bt, Pgno nFin){.
e260: 20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20    Pgno iLastPg; 
e270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e280: 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
e290: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
e2a0: 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
e2b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e2c0: 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
e2d0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
e2e0: 74 20 2a 2f 0a 0a 20 20 69 4c 61 73 74 50 67 20  t */..  iLastPg 
e2f0: 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
e300: 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30 20   if( iLastPg==0 
e310: 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20 3d  ){.    iLastPg =
e320: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
e330: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
e340: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
e350: 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
e360: 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
e370: 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
e380: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
e390: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
e3a0: 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
e3b0: 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
e3c0: 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
e3d0: 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
e3e0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
e3f0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
e400: 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e  eList==0 || nFin
e410: 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20  ==iLastPg ){.   
e420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e430: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
e440: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
e450: 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
e460: 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
e470: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e480: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e4a0: 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
e4b0: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
e4c0: 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
e4d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e4e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
e4f0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
e500: 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
e510: 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d        if( nFin==
e520: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
e530: 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
e540: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
e550: 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
e560: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
e570: 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69         ** if nFi
e580: 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  n is non-zero. I
e590: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
e5a0: 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
e5b0: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
e5c0: 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
e5d0: 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
e5e0: 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
e5f0: 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
e600: 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
e610: 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
e620: 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
e630: 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
e640: 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
e650: 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
e660: 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
e670: 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
e680: 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
e690: 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
e6a0: 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
e6b0: 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tPg, 1);.       
e6c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e6d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
e6e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
e6f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
e700: 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
e710: 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
e720: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
e730: 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
e740: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
e750: 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
e760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e770: 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
e780: 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
e790: 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
e7a0: 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
e7b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e7c0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
e7d0: 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
e7e0: 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
e7f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e800: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
e810: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
e820: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  }..      /* If n
e830: 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Fin is zero, thi
e840: 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
e850: 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
e860: 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
e870: 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
e880: 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
e890: 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
e8a0: 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
e8b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
e8c0: 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
e8d0: 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73  hand, if nFin is
e8e0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
e8f0: 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
e900: 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
e910: 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
e920: 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
e930: 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
e940: 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
e950: 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
e960: 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
e970: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
e980: 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
e990: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
e9a0: 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
e9b0: 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
e9c0: 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b  &iFreePg, 0, 0);
e9d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
e9e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e9f0: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
ea00: 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
ea10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
ea20: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
ea30: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
ea40: 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
ea50: 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30   }while( nFin!=0
ea60: 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
ea70: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ea80: 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
ea90: 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
eaa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
eab0: 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67  gerWrite(pLastPg
eac0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
ead0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
eae0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
eaf0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
eb00: 7d 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  } .      rc = re
eb10: 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
eb20: 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
eb30: 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
eb40: 67 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  g);.      releas
eb50: 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
eb60: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
eb70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
eb80: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
eb90: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 7d      } .    }.  }
eba0: 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  ..  pBt->nTrunc 
ebb0: 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20  = iLastPg - 1;. 
ebc0: 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72   while( pBt->nTr
ebd0: 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  unc==PENDING_BYT
ebe0: 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52  E_PAGE(pBt)||PTR
ebf0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
ec00: 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a  pBt->nTrunc) ){.
ec10: 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d      pBt->nTrunc-
ec20: 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
ec30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ec40: 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
ec50: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
ec60: 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
ec70: 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
ec80: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
ec90: 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
eca0: 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
ecb0: 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
ecc0: 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
ecd0: 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
ece0: 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
ecf0: 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
ed00: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
ed10: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
ed20: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
ed30: 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
ed40: 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
ed50: 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51  r occured,.** SQ
ed60: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
ed70: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
ed80: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
ed90: 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
eda0: 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
edb0: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
edc0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
edd0: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
ede0: 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
edf0: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
ee00: 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
ee10: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
ee20: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
ee30: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
ee40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
ee50: 45 3b 0a 20 20 7d 0a 20 20 69 6e 76 61 6c 69 64  E;.  }.  invalid
ee60: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
ee70: 63 68 65 28 70 42 74 29 3b 0a 20 20 72 65 74 75  che(pBt);.  retu
ee80: 72 6e 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  rn incrVacuumSte
ee90: 70 28 70 42 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p(pBt, 0);.}../*
eea0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
eeb0: 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
eec0: 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
eed0: 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
eee0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
eef0: 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
ef00: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
ef10: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
ef20: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
ef30: 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
ef40: 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
ef50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ef60: 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
ef70: 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
ef80: 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
ef90: 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
efa0: 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
efb0: 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
efc0: 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
efd0: 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
efe0: 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
eff0: 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
f000: 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
f010: 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
f020: 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
f030: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54   *pBt, Pgno *pnT
f040: 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
f050: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
f060: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
f070: 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e  Bt->pPager;.#ifn
f080: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
f090: 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
f0a0: 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
f0b0: 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ger);.#endif..  
f0c0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
f0d0: 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
f0e0: 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
f0f0: 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
f100: 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
f110: 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
f120: 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Fin = 0;..    if
f130: 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  ( pBt->nTrunc==0
f140: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
f150: 46 72 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Free;.      Pgno
f160: 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20   nPtrmap;.      
f170: 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
f180: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
f190: 20 20 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67        Pgno nOrig
f1a0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
f1b0: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
f1c0: 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66  ager);..      if
f1d0: 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
f1e0: 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20  pBt, nOrig) ){. 
f1f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f200: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f210: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
f220: 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44   if( nOrig==PEND
f230: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
f240: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  t) ){.        nO
f250: 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  rig--;.      }. 
f260: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74       nFree = get
f270: 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
f280: 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
f290: 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20        nPtrmap = 
f2a0: 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
f2b0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
f2c0: 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28  nOrig)+pgsz/5)/(
f2d0: 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e  pgsz/5);.      n
f2e0: 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
f2f0: 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
f300: 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50       if( nOrig>P
f310: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
f320: 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50  (pBt) && nFin<=P
f330: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
f340: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
f350: 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d   nFin--;.      }
f360: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 50 54  .      while( PT
f370: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
f380: 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
f390: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
f3a0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
f3b0: 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20    nFin--;.      
f3c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69  }.    }..    whi
f3d0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
f3e0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
f3f0: 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
f400: 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d  Bt, nFin);.    }
f410: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f420: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
f430: 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30    assert(nFin==0
f440: 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d   || pBt->nTrunc=
f450: 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d  =0 || nFin<=pBt-
f460: 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20  >nTrunc);.      
f470: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f480: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
f490: 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  Trunc ){.       
f4a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
f4b0: 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
f4c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
f4d0: 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
f4e0: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
f4f0: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  2], 0);.        
f500: 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
f510: 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
f520: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  , 0);.        pB
f530: 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e  t->nTrunc = nFin
f540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f550: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f560: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
f570: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
f580: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
f590: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
f5a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f5b0: 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42     *pnTrunc = pB
f5c0: 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70  t->nTrunc;.    p
f5d0: 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  Bt->nTrunc = 0;.
f5e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
f5f0: 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
f600: 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
f610: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
f620: 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .}..#endif../*.*
f630: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
f640: 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
f650: 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
f660: 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
f670: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
f680: 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
f690: 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
f6a0: 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
f6b0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
f6c0: 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
f6d0: 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
f6e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
f6f0: 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
f700: 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
f710: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
f720: 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
f730: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
f740: 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
f750: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
f760: 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
f770: 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
f780: 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
f790: 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
f7a0: 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
f7b0: 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
f7c0: 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
f7d0: 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
f7e0: 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
f7f0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
f800: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
f810: 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
f820: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
f830: 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
f840: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
f850: 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
f860: 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
f870: 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
f880: 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
f890: 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
f8a0: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
f8b0: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
f8c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
f8d0: 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65  mit() for the se
f8e0: 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
f8f0: 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
f900: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
f910: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
f920: 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
f930: 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
f940: 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
f950: 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
f960: 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
f970: 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
f980: 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
f990: 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
f9a0: 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
f9b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
f9c0: 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
f9d0: 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
f9e0: 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
f9f0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
fa00: 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
fa10: 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
fa20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
fa30: 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
fa40: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
fa50: 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
fa60: 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
fa70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fa80: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
fa90: 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
faa0: 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
fab0: 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
fac0: 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
fad0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
fae0: 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
faf0: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
fb00: 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
fb10: 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
fb20: 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
fb30: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
fb40: 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
fb50: 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
fb60: 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
fb70: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
fb80: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
fb90: 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
fba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
fbb0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
fbc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
fbd0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
fbe0: 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
fbf0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fc00: 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f  p->pBt;.    Pgno
fc10: 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 69 66   nTrunc = 0;.#if
fc20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fc30: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
fc40: 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
fc50: 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
fc60: 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
fc70: 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29  it(pBt, &nTrunc)
fc80: 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ; .      if( rc!
fc90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fcb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
fcc0: 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
fcd0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
fce0: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
fcf0: 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
fd00: 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72  nTrunc);.  }.  r
fd10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fd20: 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
fd30: 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
fd40: 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
fd50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
fd60: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
fd70: 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
fd80: 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
fd90: 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
fda0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
fdb0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
fdc0: 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
fdd0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
fde0: 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  ed.** prior to c
fdf0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
fe00: 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
fe10: 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75  3BtreeSync() rou
fe20: 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20  tine did.** all 
fe30: 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
fe40: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
fe50: 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
fe60: 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
fe70: 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
fe80: 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
fe90: 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
fea0: 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
feb0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
fec0: 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
fed0: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
fee0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
fef0: 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75  al.** (which cau
ff00: 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
ff10: 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
ff20: 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  nd drop locks..*
ff30: 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
ff40: 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
ff50: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
ff60: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
ff70: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
ff80: 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
ff90: 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
ffa0: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
ffb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ffc0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
ffd0: 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  o(Btree *p){.  B
ffe0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fff0: 2d 3e 70 42 74 3b 0a 0a 20 20 62 74 72 65 65 49  ->pBt;..  btreeI
10000 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
10010 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
10020 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
10030 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
10040 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
10050 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
10060 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
10070 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
10080 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
10090 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
100a0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
100b0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
100c0 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
100d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
100e0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
100f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10100 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
10110 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
10120 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
10130 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
10140 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
10150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
10180 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
10190 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
101a0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
101b0 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c  ;.  }.  unlockAl
101c0 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f  lTables(p);..  /
101d0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
101e0 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  has any kind of 
101f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
10200 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
10210 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
10220 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
10230 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
10240 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
10250 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20  ount reaches 0, 
10260 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61  set.  ** the sha
10270 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
10280 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
10290 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
102a0 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20  () call below.  
102b0 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ** will unlock t
102c0 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20  he pager..  */. 
102d0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
102e0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
102f0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
10300 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
10310 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
10320 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
10330 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10340 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
10350 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
10360 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20 63  et the handles c
10370 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
10380 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
10390 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
103a0 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  k.  ** the pager
103b0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
103c0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
103d0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
103e0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
103f0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
10400 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63  NS_NONE;.  unloc
10410 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
10420 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
10430 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65 74  egrity(p);.  ret
10440 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10450 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
10460 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
10470 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
10480 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
10490 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
104a0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
104b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
104c0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
104d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
104e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
104f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
10500 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20  aseTwo(p);.  }. 
10510 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
10520 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
10530 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
10540 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
10550 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
10560 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
10570 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
10580 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
10590 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
105a0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
105b0 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
105c0 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  ** defined..*/.s
105d0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
105e0 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
105f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
10600 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
10610 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
10620 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
10630 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
10640 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
10650 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
10660 67 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  g ) r++; .  }.  
10670 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
10680 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  if../*.** Rollba
10690 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
106a0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
106b0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
106c0 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
106d0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
106e0 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
106f0 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
10700 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
10710 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
10720 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
10730 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
10740 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
10750 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
10760 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
10770 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
10780 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
10790 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
107a0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
107b0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
107c0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
107d0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
107e0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
107f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
10800 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
10810 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10820 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
10830 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  ..  rc = saveAll
10840 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
10850 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
10860 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10870 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53  ACHE.  if( rc!=S
10880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10890 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72  /* This is a hor
108a0 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e  rible situation.
108b0 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   An IO or malloc
108c0 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  () error occured
108d0 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
108e0 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
108f0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
10900 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
10910 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
10920 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
10930 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
10940 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
10950 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
10960 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
10970 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
10980 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
10990 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
109a0 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
109b0 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
109c0 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
109d0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
109e0 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
109f0 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
10a00 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
10a10 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
10a20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
10a30 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
10a40 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
10a50 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
10a60 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pBt->pCursor ){.
10a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
10a80 62 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  b = pBt->pCursor
10a90 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  ->pBtree->pSqlit
10aa0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 20  e;.      if( db 
10ab0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10ac0 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74 69  e3AbortOtherActi
10ad0 76 65 56 64 62 65 73 28 64 62 2c 20 30 29 3b 0a  veVdbes(db, 0);.
10ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10af0 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
10b00 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
10b10 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
10b20 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
10b30 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
10b40 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
10b50 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  2;..#ifndef SQLI
10b60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
10b70 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  UM.    pBt->nTru
10b80 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nc = 0;.#endif..
10b90 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
10ba0 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
10bb0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
10bc0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
10bd0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
10be0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
10bf0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
10c00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
10c10 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
10c20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
10c30 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
10c40 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
10c50 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
10c60 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c  .    ** call sql
10c70 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
10c80 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
10c90 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
10ca0 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
10cb0 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
10cc0 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
10cd0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ( sqlite3BtreeGe
10ce0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
10cf0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
10d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
10d10 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
10d20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
10d30 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
10d40 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
10d50 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
10d60 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
10d70 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66  _READ;.  }..  if
10d80 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
10d90 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
10da0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
10db0 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
10dc0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
10dd0 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
10de0 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
10df0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
10e00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10e10 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
10e20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69     }.  }..  p->i
10e30 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
10e40 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74  ONE;.  pBt->inSt
10e50 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b  mt = 0;.  unlock
10e60 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
10e70 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
10e80 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75  grity(p);.  retu
10e90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10ea0 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
10eb0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
10ec0 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  .  The subtransa
10ed0 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e  ction can.** can
10ee0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
10ef0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
10f00 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
10f10 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75  ction..** You mu
10f20 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
10f30 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74  action before st
10f40 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
10f50 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  saction..** The 
10f60 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
10f70 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
10f80 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69  cally if the mai
10f90 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  n transaction.**
10fa0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
10fb0 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  s back..**.** On
10fc0 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61  ly one subtransa
10fd0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
10fe0 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ive at a time.  
10ff0 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74  It is an error t
11000 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72  o try.** to star
11010 74 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73  t a new subtrans
11020 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65  action if anothe
11030 72 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  r subtransaction
11040 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
11050 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ve..**.** Statem
11060 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
11070 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
11080 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
11090 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
110a0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
110b0 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
110c0 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
110d0 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
110e0 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
110f0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
11100 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
11110 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
11120 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
11130 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
11140 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
11150 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
11160 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
11170 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
11180 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
11190 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
111a0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
111b0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
111c0 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e    if( (p->inTran
111d0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  s!=TRANS_WRITE) 
111e0 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29  || pBt->inStmt )
111f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  {.    return pBt
11200 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
11210 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
11220 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
11230 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11240 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11250 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
11260 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
11270 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ly ? SQLITE_OK :
11280 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
11290 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  tBegin(pBt->pPag
112a0 65 72 29 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74  er);.  pBt->inSt
112b0 6d 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  mt = 1;.  return
112c0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
112d0 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65  ommit the statme
112e0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
112f0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
11300 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a  rogress.  If no.
11310 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ** subtransactio
11320 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69  n is active, thi
11330 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  s is a no-op..*/
11340 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11350 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65  eCommitStmt(Btre
11360 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
11370 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11380 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
11390 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
113a0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
113b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
113c0 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
113d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
113e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
113f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
11400 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
11410 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
11420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
11430 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73 74  ck the active st
11440 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
11450 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73  action.  If no s
11460 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  ubtransaction.**
11470 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73 20   is active this 
11480 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
11490 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75  op..**.** All cu
114a0 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
114b0 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
114c0 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
114d0 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  y attempt.** to 
114e0 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68 61  use a cursor tha
114f0 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
11500 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
11510 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  his operation.**
11520 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
11530 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  an error..*/.int
11540 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
11550 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20  lbackStmt(Btree 
11560 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
11570 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
11580 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11590 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  pBt;.  sqlite3Ma
115a0 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 3b 0a  llocDisallow();.
115b0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d    if( pBt->inStm
115c0 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  t && !pBt->readO
115d0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
115e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
115f0 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
11600 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
11610 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
11620 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
11630 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
11640 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
11650 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 3b  e3MallocAllow();
11660 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11670 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b  ./*.** Default k
11680 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey comparison fu
11690 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 73 65  nction to be use
116a0 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73  d if no comparis
116b0 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  on function.** i
116c0 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74  s specified on t
116d0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
116e0 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f  ursor() call..*/
116f0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 66 6c 74  .static int dflt
11700 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
11710 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  *NotUsed,       
11720 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
11730 74 61 20 69 73 20 6e 6f 74 20 75 73 65 64 20 2a  ta is not used *
11740 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73  /.  int n1, cons
11750 74 20 76 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f  t void *p1,    /
11760 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20 63  * First key to c
11770 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
11780 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  n2, const void *
11790 70 32 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  p2     /* Second
117a0 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
117b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  */.){.  int c;. 
117c0 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20   c = memcmp(p1, 
117d0 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a  p2, n1<n2 ? n1 :
117e0 20 6e 32 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30   n2);.  if( c==0
117f0 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d   ){.    c = n1 -
11800 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n2;.  }.  retur
11810 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n c;.}../*.** Cr
11820 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
11830 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
11840 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
11850 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
11860 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
11870 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
11880 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
11890 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
118a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
118b0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
118c0 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
118d0 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
118e0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
118f0 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
11900 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
11910 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
11920 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
11930 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
11940 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
11950 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
11960 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
11970 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
11980 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
11990 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
119a0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
119b0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
119c0 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
119d0 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
119e0 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
119f0 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
11a00 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
11a10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
11a20 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
11a30 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
11a40 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
11a50 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
11a60 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
11a70 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
11a80 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
11a90 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
11aa0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
11ab0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
11ac0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
11ad0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
11ae0 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
11af0 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
11b00 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
11b10 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
11b20 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
11b30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
11b40 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
11b50 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
11b60 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
11b70 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
11b80 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
11b90 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
11ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
11bb0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
11bc0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
11bd0 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
11be0 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
11bf0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
11c00 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
11c10 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
11c20 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
11c30 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
11c40 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
11c50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70  ..**.** The comp
11c60 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
11c70 6d 75 73 74 20 62 65 20 6c 6f 67 69 63 61 6c 6c  must be logicall
11c80 79 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 65  y the same for e
11c90 76 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a 20 6f  very cursor.** o
11ca0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
11cb0 61 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e 67 20  able.  Changing 
11cc0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
11cd0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
11ce0 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72 72  ult.** in incorr
11cf0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ect operations. 
11d00 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   If the comparis
11d10 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  on function is N
11d20 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61 75 6c  ULL, a.** defaul
11d30 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  t comparison fun
11d40 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ction is used.  
11d50 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
11d60 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c  unction is.** al
11d70 77 61 79 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  ways ignored for
11d80 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2e 0a   INTKEY tables..
11d90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11da0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
11db0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11de0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
11df0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
11e20 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
11e30 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
11e40 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
11e70 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
11e80 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70   */.  int (*xCmp
11e90 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
11ea0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
11eb0 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79  t void*), /* Key
11ec0 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   Comparison func
11ed0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
11ee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
11f10 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
11f20 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70 70 43    BtCursor **ppC
11f30 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f50 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
11f60 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
11f70 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
11f80 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61  r *pCur;.  BtSha
11f90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11fa0 74 3b 0a 0a 20 20 2a 70 70 43 75 72 20 3d 20 30  t;..  *ppCur = 0
11fb0 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ;.  if( wrFlag )
11fc0 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72  {.    if( pBt->r
11fd0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
11fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
11ff0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
12000 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64     if( checkRead
12010 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c  Locks(p, iTable,
12020 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
12030 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
12040 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
12050 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
12060 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  =0 ){.    rc = l
12070 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
12080 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  y(p);.    if( rc
12090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
120a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
120b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
120c0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
120d0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72  rFlag ){.      r
120e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
120f0 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
12100 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65  .  pCur = sqlite
12110 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
12120 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
12130 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Cur==0 ){.    rc
12140 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12150 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
12160 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
12170 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70  n;.  }.  pCur->p
12180 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
12190 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54  iTable;.  if( iT
121a0 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74  able==1 && sqlit
121b0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
121c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30  (pBt->pPager)==0
121d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
121e0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67  ITE_EMPTY;.    g
121f0 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
12200 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
12210 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
12220 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
12230 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
12240 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  r->pPage, 0);.  
12250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12260 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72  K ){.    goto cr
12270 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
12280 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
12290 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
122a0 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
122b0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
122c0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
122d0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
122e0 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  es, link the cur
122f0 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
12300 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73  hared list and s
12310 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20  et *ppCur (the. 
12320 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d   ** output argum
12330 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
12340 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43  tion)..  */.  pC
12350 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78  ur->xCompare = x
12360 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c  Cmp ? xCmp : dfl
12370 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72  tCompare;.  pCur
12380 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ->pArg = pArg;. 
12390 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
123a0 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  p;.  pCur->wrFla
123b0 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43  g = wrFlag;.  pC
123c0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
123d0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
123e0 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
123f0 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
12400 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
12410 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
12420 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
12430 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
12440 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43  _INVALID;.  *ppC
12450 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65  ur = pCur;..  re
12460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12470 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
12480 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70  ception:.  if( p
12490 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Cur ){.    relea
124a0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
124b0 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ge);.    sqliteF
124c0 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ree(pCur);.  }. 
124d0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
124e0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74  used(pBt);.  ret
124f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12500 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
12510 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
12520 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
12530 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
12540 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
12550 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
12560 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12570 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
12580 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
12590 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  r){.  BtShared *
125a0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
125b0 65 65 2d 3e 70 42 74 3b 0a 20 20 63 6c 65 61 72  ee->pBt;.  clear
125c0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
125d0 43 75 72 29 3b 0a 20 20 69 66 28 20 70 43 75 72  Cur);.  if( pCur
125e0 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
125f0 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
12600 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
12610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
12620 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
12630 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  r->pNext;.  }.  
12640 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
12650 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
12660 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
12670 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72  ->pPrev;.  }.  r
12680 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
12690 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63  >pPage);.  unloc
126a0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
126b0 42 74 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  Bt);.  invalidat
126c0 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
126d0 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Cur);.  sqliteFr
126e0 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  ee(pCur);.  retu
126f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12700 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65  ./*.** Make a te
12710 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62  mporary cursor b
12720 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  y filling in the
12730 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70   fields of pTemp
12740 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70  Cur..** The temp
12750 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20  orary cursor is 
12760 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f  not on the curso
12770 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42  r list for the B
12780 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
12790 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d  lite3BtreeGetTem
127a0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
127b0 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72   *pCur, BtCursor
127c0 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 6d   *pTempCur){.  m
127d0 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20  emcpy(pTempCur, 
127e0 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43  pCur, sizeof(*pC
127f0 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72  ur));.  pTempCur
12800 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
12810 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d  TempCur->pPrev =
12820 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43   0;.  if( pTempC
12830 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20  ur->pPage ){.   
12840 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
12850 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65  (pTempCur->pPage
12860 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
12870 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
12880 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
12890 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d  or such as was m
128a0 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74  ade by the Creat
128b0 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72  eTemporaryCursor
128c0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
128d0 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  bove..*/.void sq
128e0 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
128f0 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
12900 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
12910 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
12920 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
12930 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
12940 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
12950 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
12960 47 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f 28 29 20  GET_CELL_INFO() 
12970 6d 61 63 72 6f 2e 20 54 61 6b 65 73 20 6f 6e 65  macro. Takes one
12980 20 61 72 67 75 6d 65 6e 74 2c 20 61 20 70 6f 69   argument, a poi
12990 6e 74 65 72 20 74 6f 20 61 20 76 61 6c 69 64 0a  nter to a valid.
129a0 2a 2a 20 62 74 72 65 65 20 63 75 72 73 6f 72 20  ** btree cursor 
129b0 28 74 79 70 65 20 42 74 43 75 72 73 6f 72 2a 29  (type BtCursor*)
129c0 2e 20 20 54 68 69 73 20 6d 61 63 72 6f 20 6d 61  .  This macro ma
129d0 6b 65 73 20 73 75 72 65 20 74 68 65 20 42 74 43  kes sure the BtC
129e0 75 72 73 6f 72 2e 69 6e 66 6f 0a 2a 2a 20 66 69  ursor.info.** fi
129f0 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eld of the given
12a00 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
12a10 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
12a20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
12a30 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  all.** sqlite3Bt
12a40 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
12a50 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
12a60 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
12a70 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
12a80 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
12a90 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
12aa0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
12ab0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
12ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
12ad0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
12ae0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
12af0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
12b00 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
12b10 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
12b20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
12b30 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
12b40 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
12b50 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
12b60 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
12b70 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
12b80 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
12b90 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29  Cur->idx, &info)
12ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
12bb0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
12bc0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
12bd0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
12be0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
12bf0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
12c00 78 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  x).#endif..#defi
12c10 6e 65 20 47 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f  ne GET_CELL_INFO
12c20 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
12c60 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
12ca0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
12cb0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
12cc0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
12cd0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20   &pCur->info);  
12ce0 20 20 20 20 20 20 20 5c 0a 20 20 65 6c 73 65 20         \.  else 
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
12d40 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
12d50 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
12d60 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
12d70 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
12d80 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
12d90 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
12da0 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
12db0 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
12dc0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
12dd0 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
12de0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
12df0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
12e00 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
12e10 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
12e20 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
12e30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
12e40 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
12e50 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
12e60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
12e70 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69  in the key..*/.i
12e80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
12e90 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
12ea0 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
12eb0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  e){.  int rc = r
12ec0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
12ed0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
12ee0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
12f00 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
12f10 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
12f20 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
12f30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
12f40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
12f50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
12f60 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
12f70 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
12f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 47    }else{.      G
12f90 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f 28 70 43 75  ET_CELL_INFO(pCu
12fa0 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
12fb0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
12fc0 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
12fd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12fe0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
12ff0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
13000 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
13010 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
13020 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
13030 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
13040 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
13050 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
13060 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
13070 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
13080 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
13090 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
130a0 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
130b0 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
130c0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
130d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
130e0 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
130f0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
13100 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13110 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
13120 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
13130 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
13140 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
13150 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
13160 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
13170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13180 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
13190 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
131a0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
131b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
131c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
131d0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
131e0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
131f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
13200 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
13210 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
13220 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
13230 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
13240 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13250 20 20 20 47 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f     GET_CELL_INFO
13260 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
13270 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
13280 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  o.nData;.    }. 
13290 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
132a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
132b0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
132c0 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
132d0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
132e0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
132f0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
13300 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
13310 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
13320 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
13330 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
13340 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
13350 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
13360 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
13370 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
13380 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
13390 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
133a0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
133b0 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
133c0 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
133d0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
133e0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
133f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13400 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
13410 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e  ** Unless pPgnoN
13420 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ext is NULL, the
13430 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
13440 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
13450 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  w .** page in th
13460 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
13470 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
13480 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
13490 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c  ovfl.** is the l
134a0 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 27 73  ast page in it's
134b0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70   linked list, *p
134c0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
134d0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
134e0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
134f0 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69   NULL, *ppPage i
13500 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65 6d  s set to the Mem
13510 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20  Page* handle.** 
13520 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20 54  for page ovfl. T
13530 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70 61  he underlying pa
13540 67 65 72 20 70 61 67 65 20 6d 61 79 20 68 61 76  ger page may hav
13550 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
13560 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f 43  .** with the noC
13570 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74 2c  ontent flag set,
13580 20 73 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   so the page dat
13590 61 20 61 63 63 65 73 73 61 62 6c 65 20 76 69 61  a accessable via
135a0 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 20  .** this handle 
135b0 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
135c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
135d0 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
135e0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
135f0 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  Bt, .  Pgno ovfl
13600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13610 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20      /* Overflow 
13620 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
13630 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
13640 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
13650 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f  emPage handle */
13660 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
13670 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
13680 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
13690 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
136a0 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
136b0 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ext = 0;.  int r
136c0 63 3b 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  c;..  /* One of 
136d0 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62  these must not b
136e0 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  e NULL. Otherwis
136f0 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73  e, why call this
13700 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20   function? */.  
13710 61 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c  assert(ppPage ||
13720 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20   pPgnoNext);..  
13730 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20  /* If pPgnoNext 
13740 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
13750 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
13760 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f  eing called to o
13770 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d  btain.  ** a Mem
13780 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20  Page* reference 
13790 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61  only. No page-da
137a0 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ta is required i
137b0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
137c0 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65  /.  if( !pPgnoNe
137d0 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  xt ){.    return
137e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
137f0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
13800 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a  ppPage, 1);.  }.
13810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13820 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13830 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
13840 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
13850 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
13860 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
13870 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
13880 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
13890 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
138a0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
138b0 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
138c0 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
138d0 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
138e0 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
138f0 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
13900 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
13910 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
13920 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
13930 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
13940 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
13950 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
13960 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
13970 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
13980 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
13990 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
139a0 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
139b0 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
139c0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
139d0 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
139e0 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
139f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
13a00 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
13a10 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
13a20 69 66 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69  if( iGuess<=sqli
13a30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
13a40 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
13a50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
13a60 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
13a70 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
13a80 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
13a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13aa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ac0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
13ad0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
13ae0 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
13af0 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
13b00 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ss;.      }.    
13b10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13b20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70  if( next==0 || p
13b30 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d  pPage ){.    Mem
13b40 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
13b50 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
13b60 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
13b70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
13b80 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20  , next!=0);.    
13b90 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
13ba0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
13bb0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d  );.    if( next=
13bc0 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
13bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
13be0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
13bf0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
13c00 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61 67  }..    if( ppPag
13c10 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  e ){.      *ppPa
13c20 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20  ge = pPage;.    
13c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c  }else{.      rel
13c40 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
13c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50  .    }.  }.  *pP
13c60 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
13c70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13c80 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
13c90 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
13ca0 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
13cb0 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
13cc0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
13cd0 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
13ce0 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
13cf0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
13d00 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
13d10 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
13d20 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
13d30 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
13d40 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
13d50 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
13d60 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
13d70 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
13d80 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
13d90 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
13da0 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
13db0 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
13dc0 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
13dd0 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
13de0 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
13df0 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
13e00 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
13e10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13e20 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
13e30 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
13e40 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
13e50 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
13e60 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
13e70 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
13e80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
13e90 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
13ea0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
13eb0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
13ec0 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
13ed0 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
13ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13ef0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
13f00 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
13f10 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
13f20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
13f30 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
13f40 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
13f50 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
13f60 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
13f70 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
13f80 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
13f90 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
13fa0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
13fb0 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
13fc0 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
13fd0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
13fe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13ff0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
14000 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14030 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
14040 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
14050 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
14060 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
14070 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
14080 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
14090 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
140a0 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
140b0 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
140c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
140d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
140e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
140f0 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
14100 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
14110 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
14120 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
14130 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
14140 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
14150 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
14160 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
14170 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
14180 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
14190 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
141a0 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
141b0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
141c0 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
141d0 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
141e0 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
141f0 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
14200 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
14210 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
14220 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
14230 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
14240 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
14250 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
14260 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14270 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
14280 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
14290 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
142a0 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
142b0 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62 79  ads or writes by
142c0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79  tes from the pay
142d0 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61  load area.  Data
142e0 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61   might .** appea
142f0 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
14300 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ge or be scatter
14310 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
14320 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  le overflow .** 
14330 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
14340 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
14350 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
14360 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
14370 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
14380 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
14390 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
143a0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
143b0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
143c0 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
143d0 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
143e0 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
143f0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
14400 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
14410 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
14420 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
14430 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
14440 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
14450 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
14460 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
14470 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
14480 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once 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 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
144b0 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
144c0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
144d0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
144e0 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
144f0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
14500 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
14510 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
14520 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
14530 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
14540 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
14550 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
14560 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
14570 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
14580 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
14590 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
145a0 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
145b0 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
145c0 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
145d0 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
145e0 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
145f0 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
14600 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
14610 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
14620 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
14630 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
14640 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14650 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
14660 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
14670 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
14680 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
14690 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
146a0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
146b0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
146c0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  d */.  int amt, 
146d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
146e0 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
146f0 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
14700 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
14710 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
14720 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
14730 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70  r */ .  int skip
14740 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Key,         /* 
14750 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74  offset begins at
14760 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
14770 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65   true */.  int e
14780 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
14790 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e  /* zero to read.
147a0 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69   non-zero to wri
147b0 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  te. */.){.  unsi
147c0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
147d0 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oad;.  int rc = 
147e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32  SQLITE_OK;.  u32
147f0 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64   nKey;.  int iId
14800 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
14810 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
14820 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a  pPage;        /*
14830 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
14840 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
14850 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
14860 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
14870 42 74 72 65 65 2d 3e 70 42 74 3b 20 20 20 2f 2a  Btree->pBt;   /*
14880 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
14890 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
148a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
148b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
148c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
148d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
148e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
148f0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
14900 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
14910 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
14920 74 3e 3d 30 20 29 3b 0a 0a 20 20 47 45 54 5f 43  t>=0 );..  GET_C
14930 45 4c 4c 5f 49 4e 46 4f 28 70 43 75 72 29 3b 0a  ELL_INFO(pCur);.
14940 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
14950 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
14960 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
14970 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
14980 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
14990 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  : pCur->info.nKe
149a0 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b  y);..  if( skipK
149b0 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
149c0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
149d0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
149e0 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
149f0 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a  .nData ){.    /*
14a00 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
14a10 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
14a20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
14a30 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
14a40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14a50 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
14a60 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
14a70 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
14a80 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
14a90 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
14aa0 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
14ab0 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
14ac0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
14ad0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
14ae0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
14af0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
14b00 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
14b10 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
14b20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
14b30 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
14b40 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
14b50 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
14b60 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
14b70 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
14b80 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
14b90 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
14ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
14bb0 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
14bc0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
14bd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14be0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
14bf0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f  .    const int o
14c00 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
14c10 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
14c20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
14c30 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
14c40 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
14c50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
14c60 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
14c70 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
14c80 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
14c90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ca0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
14cb0 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
14cc0 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
14cd0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
14ce0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
14cf0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
14d00 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
14d10 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
14d20 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
14d30 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
14d40 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
14d50 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
14d60 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
14d70 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
14d80 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
14d90 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
14da0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
14db0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
14dc0 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
14dd0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
14de0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
14df0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
14e00 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
14e10 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
14e20 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
14e30 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
14e40 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
14e50 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
14e60 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
14e70 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
14e80 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
14e90 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
14ea0 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
14eb0 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
14ec0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
14ed0 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
14ee0 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69  )sqliteMalloc(si
14ef0 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c  zeof(Pgno)*nOvfl
14f00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  );.      if( nOv
14f10 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  fl && !pCur->aOv
14f20 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
14f30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14f40 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
14f50 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
14f60 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
14f70 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
14f80 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
14f90 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
14fa0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
14fb0 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
14fc0 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
14fd0 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
14fe0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
14ff0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
15000 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
15010 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
15020 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
15030 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
15040 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
15050 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
15060 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
15070 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
15080 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
15090 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
150a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
150b0 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
150c0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
150d0 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
150e0 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  +){..#ifndef SQL
150f0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
15100 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  B.      /* If re
15110 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
15120 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
15130 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
15140 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
15150 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
15160 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
15170 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
15180 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
15190 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
151a0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
151b0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
151c0 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
151d0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ge;.      }.#end
151e0 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  if..      if( of
151f0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
15200 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
15210 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
15220 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
15230 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
15240 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
15250 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
15260 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
15270 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
15280 54 68 65 20 70 61 67 65 0a 09 2a 2a 20 64 61 74  The page..** dat
15290 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
152a0 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
152b0 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
152c0 65 72 66 6c 6f 77 0a 09 2a 2a 20 70 61 67 65 2d  erflow..** page-
152d0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
152e0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
152f0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
15300 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
15310 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
15320 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e  .        */.#ifn
15330 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15340 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20  INCRBLOB.       
15350 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
15360 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
15370 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
15380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
15390 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
153a0 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
153b0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
153c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
153d0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
153e0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
153f0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
15400 67 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ge);.        ass
15410 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
15420 4b 20 7c 7c 20 6e 65 78 74 50 61 67 65 3d 3d 30  K || nextPage==0
15430 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
15440 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
15450 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15460 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
15470 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
15480 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
15490 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
154a0 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
154b0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
154c0 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
154d0 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
154e0 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
154f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50    */.        DbP
15500 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
15510 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
15520 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
15530 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
15540 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
15550 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29  tPage, &pDbPage)
15560 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15580 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
15590 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
155a0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
155b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
155c0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
155d0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
155e0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
155f0 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
15600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20  {.            a 
15610 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
15620 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  set;.          }
15630 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15640 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
15650 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
15660 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
15670 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
15680 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
15690 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
156a0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
156b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
156c0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
156d0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
156e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
156f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
15700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15710 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
15720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
15730 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
15740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15750 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
15760 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
15770 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
15780 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
15790 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
157a0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
157b0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
157c0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
157d0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
157e0 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
157f0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
15800 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
15810 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
15820 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
15830 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
15840 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
15850 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
15860 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
15870 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
15880 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15890 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
158a0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
158b0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
158c0 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
158d0 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
158e0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
158f0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
15900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15910 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
15920 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
15930 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
15940 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
15950 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e!=0 );.    if( 
15960 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
15970 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
15980 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
15990 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
159a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
159b0 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  >pPage->intKey==
159c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
159d0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
159e0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
159f0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
15a00 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
15a10 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
15a20 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
15a30 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
15a40 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
15a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15a60 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
15a70 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
15a80 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
15a90 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
15aa0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
15ab0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
15ac0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
15ad0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
15ae0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
15af0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
15b00 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
15b10 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
15b20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
15b30 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
15b40 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
15b50 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
15b60 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
15b70 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
15b80 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
15b90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15ba0 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
15bb0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
15bc0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
15bd0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
15be0 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
15bf0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
15c00 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
15c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15c20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
15c30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
15c40 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
15c50 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
15c60 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
15c70 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
15c80 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
15c90 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
15ca0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
15cb0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
15cc0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
15cd0 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 1, 0);.  }.  
15ce0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15cf0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
15d00 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
15d10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
15d20 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
15d30 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
15d40 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
15d50 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
15d60 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
15d70 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
15d80 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30  ey if skipKey==0
15d90 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74   and it points t
15da0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
15db0 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b  of data if.** sk
15dc0 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e  ipKey==1.  The n
15dd0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
15de0 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f  f available key/
15df0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a  data is written.
15e00 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  ** into *pAmt.  
15e10 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
15e20 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
15e30 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
15e40 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  .** a valid poin
15e50 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
15e60 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
15e70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
15e80 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
15e90 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
15ea0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
15eb0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
15ec0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
15ed0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
15ee0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
15ef0 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
15f00 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
15f10 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
15f20 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
15f30 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
15f40 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
15f50 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
15f60 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
15f70 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
15f80 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
15f90 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
15fa0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
15fb0 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  ly.** the key/da
15fc0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
15fd0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
15fe0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
15ff0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
16000 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
16010 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
16020 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
16030 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
16040 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
16050 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
16060 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
16070 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
16080 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
16090 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
160a0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
160b0 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
160c0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
160d0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
160e0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
160f0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
16100 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
16110 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
16120 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
16130 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
16140 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
16150 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
16160 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
16170 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
16180 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
16190 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
161a0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
161b0 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
161c0 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
161d0 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  int nLocal;..
161e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
161f0 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
16200 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
16210 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16220 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
16230 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
16240 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
16250 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
16260 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
16270 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 47 45 54 5f  >nCell );.  GET_
16280 43 45 4c 4c 5f 49 4e 46 4f 28 70 43 75 72 29 3b  CELL_INFO(pCur);
16290 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
162a0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
162b0 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
162c0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
162d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
162e0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
162f0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
16300 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d      nKey = pCur-
16310 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
16320 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
16330 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
16340 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
16350 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
16360 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
16370 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
16380 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
16390 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e  Local;.    if( n
163a0 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20  Local>nKey ){.  
163b0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65      nLocal = nKe
163c0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  y;.    }.  }.  *
163d0 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
163e0 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
163f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
16400 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
16410 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
16420 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
16430 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
16440 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
16450 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
16460 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
16470 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
16480 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
16490 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
164a0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
164b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
164c0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
164d0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
164e0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
164f0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
16500 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
16510 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
16520 65 65 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ee routine..**.*
16530 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
16540 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
16550 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
16560 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
16570 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
16580 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
16590 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
165a0 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
165b0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
165c0 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
165d0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
165e0 6d 74 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  mt){.  if( pCur-
165f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
16600 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
16610 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
16620 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
16630 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
16640 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16650 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
16660 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
16670 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
16680 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
16690 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
166a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
166b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
166c0 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
166d0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
166e0 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
166f0 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
16700 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
16710 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
16720 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
16730 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
16740 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
16750 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
16760 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
16770 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   to..*/.static i
16780 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
16790 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
167a0 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
167b0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
167c0 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65   *pNewPage;.  Me
167d0 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b  mPage *pOldPage;
167e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
167f0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
16800 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
16810 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16820 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
16830 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
16840 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
16850 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43  o, &pNewPage, pC
16860 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66  ur->pPage);.  if
16870 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16880 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64  ;.  pNewPage->id
16890 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  xParent = pCur->
168a0 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20  idx;.  pOldPage 
168b0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
168c0 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68   pOldPage->idxSh
168d0 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  ift = 0;.  relea
168e0 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29  sePage(pOldPage)
168f0 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20  ;.  pCur->pPage 
16900 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
16910 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
16920 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
16930 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
16940 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a  age->nCell<1 ){.
16950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16960 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
16970 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
16980 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16990 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
169a0 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
169b0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
169c0 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  its table..**.**
169d0 20 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   The virtual roo
169e0 74 20 70 61 67 65 20 69 73 20 74 68 65 20 72 6f  t page is the ro
169f0 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74  ot page for most
16a00 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a   tables.  But.**
16a10 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72   for the table r
16a20 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c  ooted on page 1,
16a30 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65   sometime the re
16a40 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  al root page.** 
16a50 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20  is empty except 
16a60 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
16a70 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20  inter.  In such 
16a80 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72  cases the.** vir
16a90 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
16aa0 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
16ab0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
16ac0 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69  r of page.** 1 i
16ad0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
16ae0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16af0 65 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d  eeIsRootPage(Mem
16b00 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
16b10 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
16b20 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
16b30 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
16b40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
16b50 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70    if( pParent->p
16b60 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30  gno>1 ) return 0
16b70 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65  ;.  if( get2byte
16b80 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
16b90 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
16ba0 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74  set+3])==0 ) ret
16bb0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
16bc0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
16bd0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
16be0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
16bf0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
16c00 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
16c10 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
16c20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
16c30 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
16c40 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
16c50 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
16c60 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
16c70 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
16c80 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
16c90 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
16ca0 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
16cb0 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
16cc0 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
16cd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
16ce0 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
16cf0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
16d00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
16d10 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ent;.  MemPage *
16d20 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78  pPage;.  int idx
16d30 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72  Parent;..  asser
16d40 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
16d50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
16d60 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
16d70 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
16d80 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ( pPage!=0 );.  
16d90 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
16da0 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28  BtreeIsRootPage(
16db0 70 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72  pPage) );.  pPar
16dc0 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
16dd0 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20  rent;.  assert( 
16de0 70 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20  pParent!=0 );.  
16df0 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67  idxParent = pPag
16e00 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20  e->idxParent;.  
16e10 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
16e20 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
16e30 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
16e40 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d  (pPage);.  pCur-
16e50 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74  >pPage = pParent
16e60 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
16e70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Size = 0;.  asse
16e80 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78  rt( pParent->idx
16e90 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43  Shift==0 );.  pC
16ea0 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72  ur->idx = idxPar
16eb0 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ent;.}../*.** Mo
16ec0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
16ed0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   the root page.*
16ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
16ef0 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
16f00 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
16f10 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
16f20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16f30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16f40 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
16f50 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 43 75  >pBt;..  if( pCu
16f60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16f70 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
16f80 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72  .    clearCursor
16f90 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
16fa0 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
16fb0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
16fc0 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d   pRoot && pRoot-
16fd0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
16fe0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73  oRoot ){.    ass
16ff0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e  ert( pRoot->isIn
17000 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  it );.  }else{. 
17010 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51     if( .      SQ
17020 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67  LITE_OK!=(rc = g
17030 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
17040 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
17050 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20  t, &pRoot, 0)). 
17060 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72     ){.      pCur
17070 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
17080 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
17090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
170a0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
170b0 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
170c0 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
170d0 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70  = pRoot;.  }.  p
170e0 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20  Cur->idx = 0;.  
170f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
17100 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f   = 0;.  if( pRoo
17110 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
17120 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
17130 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
17140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
17150 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  ot->pgno==1 );. 
17160 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
17170 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
17180 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
17190 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
171a0 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20  sert( subpage>0 
171b0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
171c0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
171d0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
171e0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
171f0 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  ubpage);.  }.  p
17200 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
17210 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
17220 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
17230 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
17240 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  D);.  return rc;
17250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
17260 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
17270 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
17280 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
17290 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
172a0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
172b0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
172c0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
172d0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
172e0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
172f0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
17300 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
17310 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
17320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
17330 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
17340 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
17350 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
17360 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
17370 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
17380 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17390 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
173a0 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65    while( !(pPage
173b0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
173c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
173d0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
173e0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
173f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
17400 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
17410 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
17420 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a  e, pCur->idx));.
17430 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
17440 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
17450 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
17460 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
17490 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
174a0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
174b0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
174c0 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
174d0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
174e0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
174f0 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
17500 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
17510 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
17520 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
17530 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
17540 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
17550 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
17560 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
17570 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
17580 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
17590 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
175a0 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
175b0 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
175c0 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
175d0 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
175e0 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
175f0 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
17600 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
17610 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
17620 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
17630 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
17640 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
17650 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
17660 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
17670 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
17680 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
17690 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
176a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
176b0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
176c0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
176d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
176e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
176f0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
17700 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
17710 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
17720 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
17730 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
17740 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
17750 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
17760 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
17770 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d  ur->idx = pPage-
17780 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70 43  >nCell - 1;.  pC
17790 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
177a0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
177b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
177c0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
177d0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
177e0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
177f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17800 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
17810 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
17820 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
17830 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
17840 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
17850 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
17860 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
17870 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
17880 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
17890 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
178a0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
178b0 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  t rc;.  rc = mov
178c0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
178d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
178e0 20 72 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d   rc;.  if( pCur-
178f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17900 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  INVALID ){.    a
17910 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
17920 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
17930 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
17940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17950 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
17960 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
17970 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70 52  nCell>0 );.  *pR
17980 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d  es = 0;.  rc = m
17990 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
179a0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
179b0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
179c0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
179d0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
179e0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
179f0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
17a00 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
17a10 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
17a20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
17a30 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
17a40 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
17a50 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
17a60 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
17a70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17a80 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
17a90 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
17aa0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
17ab0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
17ac0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
17ad0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
17ae0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
17af0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
17b00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
17b10 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
17b20 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  l==0 );.    *pRe
17b30 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
17b40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17b50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
17b60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17b70 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73  VALID );.  *pRes
17b80 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76   = 0;.  rc = mov
17b90 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
17ba0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
17bb0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
17bc0 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
17bd0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
17be0 6e 74 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e  ntry near pKey/n
17bf0 4b 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  Key..** Return a
17c00 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
17c10 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
17c20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65  tables, only the
17c30 20 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20   nKey parameter 
17c40 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
17c50 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
17c60 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c  or other tables,
17c70 20 6e 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d   nKey is the num
17c80 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17c90 64 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e  data.** in pKey.
17ca0 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e    The comparison
17cb0 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66   function specif
17cc0 69 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72  ied when the cur
17cd0 73 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74  sor was.** creat
17ce0 65 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ed is used to co
17cf0 6d 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  mpare keys..**.*
17d00 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
17d10 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
17d20 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
17d30 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
17d40 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
17d50 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
17d60 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
17d70 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
17d80 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
17d90 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
17da0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
17db0 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
17dc0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
17dd0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
17de0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
17df0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
17e00 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
17e10 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75   which the.** cu
17e20 72 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20  rsor is written 
17e30 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65 73  to *pRes if pRes
17e40 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61  !=NULL.  The mea
17e50 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20  ning of.** this 
17e60 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c  value is as foll
17e70 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
17e80 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
17e90 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
17ea0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
17eb0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
17ed0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65  smaller than pKe
17ee0 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
17ef0 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
17f10 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
17f20 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
17f30 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
17f40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
17f50 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
17f60 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
17f70 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
17f80 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
17f90 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
17fa0 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a  y matches pKey..
17fb0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
17fc0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
17fd0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
17fe0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
17ff0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
18000 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
18010 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a  r than pKey..*/.
18020 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18030 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
18040 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
18050 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
18060 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
18070 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
18080 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ,      /* The ke
18090 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e  y content for in
180a0 64 69 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64  dices.  Not used
180b0 20 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   by tables */.  
180c0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
180d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
180e0 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68 65 20  f pKey.  Or the 
180f0 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 20 2a  key for tables *
18100 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
18110 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  t,         /* If
18120 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
18130 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
18140 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
18150 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
18160 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72 65 73     /* Search res
18170 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20  ult flag */.){. 
18180 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
18190 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
181a0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
181b0 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74  urn rc;.  assert
181c0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  ( pCur->pPage );
181d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
181e0 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  >pPage->isInit )
181f0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
18200 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
18210 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
18220 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
18230 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
18240 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
18250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18260 4b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29  K;.  }.  for(;;)
18270 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
18280 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
18290 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
182a0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
182b0 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 63  pPage;.    int c
182c0 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20   = -1;  /* pRes 
182d0 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20  return if table 
182e0 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65  is empty must be
182f0 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d   -1 */.    lwr =
18300 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
18310 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
18320 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e    if( !pPage->in
18330 74 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d 30 20  tKey && pKey==0 
18340 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18350 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18360 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
18370 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
18380 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
18390 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  = upr;.    }else
183a0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64  {.      pCur->id
183b0 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b  x = (upr+lwr)/2;
183c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c  .    }.    if( l
183d0 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b  wr<=upr ) for(;;
183e0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
183f0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69  CellKey;.      i
18400 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
18410 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
18420 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ize = 0;.      i
18430 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
18440 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
18450 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pCell;.        p
18460 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
18470 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
18480 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
18490 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
184a0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
184b0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
184c0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
184d0 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
184e0 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
184f0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
18500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
18510 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
18520 36 34 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  64 *)&nCellKey);
18530 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
18540 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20  llKey<nKey ){.  
18550 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
18560 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
18570 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20  ( nCellKey>nKey 
18580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
18590 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   +1;.        }el
185a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20  se{.          c 
185b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
185c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
185d0 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c      int availabl
185e0 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e;.        pCell
185f0 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65  Key = (void *)fe
18600 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
18610 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b   &available, 0);
18620 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65  .        nCellKe
18630 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
18640 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
18650 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c   available>=nCel
18660 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  lKey ){.        
18670 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d    c = pCur->xCom
18680 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c  pare(pCur->pArg,
18690 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c   nCellKey, pCell
186a0 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29  Key, nKey, pKey)
186b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
186c0 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
186d0 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
186e0 6f 63 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20  ocRaw( nCellKey 
186f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
18700 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72   pCellKey==0 ) r
18710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
18720 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  EM;.          rc
18730 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
18740 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ey(pCur, 0, nCel
18750 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43  lKey, (void *)pC
18760 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
18770 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f     c = pCur->xCo
18780 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67  mpare(pCur->pArg
18790 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  , nCellKey, pCel
187a0 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
187b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
187c0 69 74 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79  iteFree(pCellKey
187d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
187e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
187f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18800 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
18810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
18820 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
18830 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
18840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
18850 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20  r = pCur->idx;. 
18860 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c           upr = l
18870 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  wr - 1;.        
18880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
188a0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
188b0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
188c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
188d0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
188e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
188f0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
18900 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31  wr = pCur->idx+1
18910 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18920 20 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75         upr = pCu
18930 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20  r->idx-1;.      
18940 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
18950 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
18960 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18970 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
18980 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20  (lwr+upr)/2;.   
18990 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
189a0 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20  wr==upr+1 );.   
189b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
189c0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
189d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
189e0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
189f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
18a00 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
18a10 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
18a20 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
18a30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
18a40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
18a50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18a60 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
18a70 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
18a80 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
18a90 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
18aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
18ab0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
18ac0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
18ad0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
18ae0 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l );.      if( p
18af0 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b  Res ) *pRes = c;
18b00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18b10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18b20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c     pCur->idx = l
18b30 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
18b40 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
18b50 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
18b60 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
18b70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
18b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18b90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
18ba0 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d  NOT REACHED */.}
18bb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
18bc0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
18bd0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
18be0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
18bf0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
18c00 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
18c10 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
18c20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
18c30 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
18c40 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
18c50 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
18c60 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
18c70 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
18c80 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
18c90 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
18ca0 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
18cb0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
18cc0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
18cd0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
18ce0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
18cf0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
18d00 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
18d10 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
18d20 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
18d30 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
18d40 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
18d50 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
18d60 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
18d70 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
18d80 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
18d90 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
18da0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
18db0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
18dc0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
18dd0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
18de0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
18df0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
18e00 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
18e10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
18e20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
18e30 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
18e40 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
18e50 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
18e60 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
18e70 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
18e80 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
18e90 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
18ea0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
18eb0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
18ec0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18ed0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
18ee0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
18ef0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
18f00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
18f10 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
18f20 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
18f30 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
18f40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18f50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
18f60 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
18f70 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50   pRes!=0 );.  pP
18f80 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
18f90 65 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  e;.  if( CURSOR_
18fa0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
18fb0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
18fc0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
18fd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18fe0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
18ff0 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip>0 ){.    pCur
19000 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
19010 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
19020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19030 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
19040 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  p = 0;..  assert
19050 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
19060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19070 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
19080 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
19090 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69  idx++;.  pCur->i
190a0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
190b0 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d   if( pCur->idx>=
190c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
190d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
190e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
190f0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
19100 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
19110 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
19120 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
19130 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
19140 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19150 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
19160 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
19170 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
19180 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19190 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
191a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
191b0 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
191c0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
191d0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
191e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
191f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
19200 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
19210 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19220 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19230 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
19240 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
19250 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
19260 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
19270 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
19280 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
19290 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
192a0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
192b0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ata ){.      rc 
192c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
192d0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
192e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
192f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19300 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
19310 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
19320 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
19330 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
19340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19350 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
19360 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
19370 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19380 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
19390 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
193a0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
193b0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
193c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
193d0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
193e0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
193f0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
19400 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
19410 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
19420 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
19430 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
19440 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
19450 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
19460 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
19470 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19480 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
19490 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
194a0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
194b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
194c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
194d0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
194e0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
194f0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
19500 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19510 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
19520 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53  ;.  }.  if( CURS
19530 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
19540 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
19550 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
19560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19570 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
19580 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
19590 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
195a0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
195b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
195c0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
195d0 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
195e0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
195f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19600 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
19610 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
19620 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
19630 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
19640 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
19650 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  ( findCell(pPage
19660 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a  , pCur->idx) );.
19670 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
19680 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
19690 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
196a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
196b0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
196c0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
196d0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
196e0 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20  ur->idx==0 ){.  
196f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
19700 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
19710 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
19720 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
19730 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
19740 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
19750 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
19760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19770 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19780 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
19790 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
197a0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
197b0 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Page;.    }.    
197c0 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20  pCur->idx--;.   
197d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
197e0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
197f0 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
19800 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
19810 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
19820 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
19830 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
19840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19850 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19860 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
19870 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
19880 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
19890 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
198a0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
198b0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
198c0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
198d0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
198e0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
198f0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
19900 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
19910 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
19920 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
19930 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
19940 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
19950 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
19960 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
19970 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
19980 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
19990 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
199a0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
199b0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
199c0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
199d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
199e0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
199f0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
19a00 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
19a10 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
19a20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
19a30 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
19a40 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
19a50 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
19a60 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
19a70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
19a80 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
19a90 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19aa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
19ab0 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
19ac0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
19ad0 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
19ae0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
19af0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
19b00 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
19b10 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
19b20 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
19b30 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
19b40 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
19b50 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
19b60 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
19b70 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
19b80 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
19b90 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
19ba0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
19bb0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
19bc0 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
19bd0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
19be0 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
19bf0 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
19c00 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
19c10 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
19c20 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
19c30 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
19c40 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
19c50 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
19c60 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
19c70 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
19c80 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
19c90 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
19ca0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
19cb0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
19cc0 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
19cd0 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
19ce0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
19cf0 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
19d00 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
19d10 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
19d20 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
19d30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19d40 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
19d50 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
19d60 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
19d70 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
19d80 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
19d90 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
19da0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
19db0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
19dc0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20  evTrunk = 0;..  
19dd0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
19de0 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34  age1;.  n = get4
19df0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
19e00 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
19e10 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
19e20 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
19e30 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
19e40 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
19e50 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
19e60 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
19e70 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
19e80 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
19e90 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
19ea0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
19eb0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
19ec0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
19ed0 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
19ee0 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
19ef0 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
19f00 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
19f10 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
19f20 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
19f30 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
19f40 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
19f50 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
19f60 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
19f70 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
19f80 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
19f90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19fa0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
19fb0 69 66 28 20 65 78 61 63 74 20 29 7b 0a 20 20 20  if( exact ){.   
19fc0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
19fd0 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
19fe0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  y>0 );.      ass
19ff0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
1a000 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63  cuum );.      rc
1a010 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1a020 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
1a030 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1a040 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a050 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1a060 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
1a070 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72   ){.        sear
1a080 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
1a090 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f    }.      *pPgno
1a0a0 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d   = nearby;.    }
1a0b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1a0c0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
1a0d0 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
1a0e0 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
1a0f0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
1a100 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
1a110 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
1a120 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
1a130 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
1a140 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1a150 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1a160 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1a170 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1a180 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1a190 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1a1a0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
1a1b0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
1a1c0 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
1a1d0 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
1a1e0 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
1a1f0 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
1a200 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
1a210 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
1a220 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
1a230 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
1a240 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
1a250 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
1a260 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
1a270 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a  by' is located..
1a280 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
1a290 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
1a2a0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1a2b0 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
1a2c0 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
1a2d0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
1a2e0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1a2f0 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
1a300 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
1a310 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1a320 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
1a330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1a340 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1a350 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
1a360 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
1a370 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1a380 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
1a390 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
1a3a0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1a3b0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  page;.      }.. 
1a3c0 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
1a3d0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1a3e0 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
1a3f0 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
1a400 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
1a410 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
1a420 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
1a430 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
1a440 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
1a450 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
1a460 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
1a470 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
1a480 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
1a490 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
1a4a0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
1a4b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1a4c0 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
1a4d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1a4e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1a4f0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1a500 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1a510 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1a520 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1a530 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1a540 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
1a550 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
1a560 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
1a570 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
1a580 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1a590 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
1a5a0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
1a5b0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1a5c0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
1a5d0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
1a5e0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
1a5f0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
1a600 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
1a610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70     }else if( k>p
1a620 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
1a630 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 20 20   - 8 ){.        
1a640 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
1a650 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
1a660 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1a670 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
1a680 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1a690 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1a6a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1a6b0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
1a6c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a6d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
1a6e0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
1a6f0 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
1a700 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1a710 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
1a720 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
1a730 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
1a740 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
1a750 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
1a760 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
1a770 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
1a780 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
1a790 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
1a7a0 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
1a7b0 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
1a7c0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
1a7d0 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
1a7e0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
1a7f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a800 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1a810 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1a820 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1a830 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1a840 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1a850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a860 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
1a870 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1a880 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1a890 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1a8a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1a8b0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1a8c0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1a8d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a8e0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
1a8f0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1a900 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1a910 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1a920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1a930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1a940 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
1a950 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
1a960 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
1a970 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
1a980 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
1a990 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
1a9a0 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
1a9b0 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
1a9c0 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
1a9d0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
1a9e0 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
1a9f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
1aa00 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
1aa10 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
1aa20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
1aa30 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1aa40 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
1aa50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1aa60 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1aa70 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
1aa80 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
1aa90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1aaa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aab0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1aac0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1aad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1aae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1aaf0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
1ab00 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1ab10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1ab20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1ab40 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
1ab50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
1ab60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ab70 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1ab80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
1ab90 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
1aba0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
1abb0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1abc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
1abd0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
1abe0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
1abf0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1ac00 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1ac10 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
1ac20 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
1ac30 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
1ac40 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1ac50 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1ac60 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
1ac70 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
1ac80 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1ac90 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
1aca0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1acb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1acc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1acd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1ace0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
1acf0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1ad00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1ad10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1ad20 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ad40 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1ad50 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1ad60 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
1ad70 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1ad80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ad90 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1ada0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1adb0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
1adc0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
1add0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
1ade0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
1adf0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
1ae00 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
1ae10 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
1ae20 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
1ae30 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a     int closest;.
1ae40 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
1ae50 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
1ae60 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
1ae70 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
1ae80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1ae90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1aea0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1aeb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1aec0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1aed0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1aee0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1aef0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
1af00 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
1af10 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a     int i, dist;.
1af20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1af30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1af40 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65   dist = get4byte
1af50 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
1af60 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1af70 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73  if( dist<0 ) dis
1af80 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20  t = -dist;.     
1af90 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
1afa0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
1afb0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65       int d2 = ge
1afc0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
1afd0 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  i*4]) - nearby;.
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1aff0 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b  d2<0 ) d2 = -d2;
1b000 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1b010 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
1b020 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1b030 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
1b040 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
1b050 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b080 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1b090 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1b0a0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
1b0b0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
1b0c0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
1b0d0 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
1b0e0 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72  t || iPage==near
1b0f0 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
1b100 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
1b110 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
1b120 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  Pgno>sqlite3Page
1b130 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1b140 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1b150 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70         /* Free p
1b160 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20  age off the end 
1b170 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1b180 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1b190 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1b1a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1b1b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
1b1c0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1b1d0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
1b1e0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
1b1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b200 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
1b210 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
1b230 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
1b240 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
1b250 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
1b260 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
1b270 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1b280 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
1b290 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
1b2a0 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
1b2b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b2c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1b2d0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1b2e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1b2f0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1b300 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1b310 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20  ppPage, 1);.    
1b320 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1b350 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1b360 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1b370 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1b380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b390 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
1b3a0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
1b3b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1b3c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1b3e0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
1b3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1b400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b410 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1b420 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1b430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1b440 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
1b450 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
1b460 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
1b470 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
1b480 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1b490 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
1b4a0 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
1b4b0 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
1b4c0 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
1b4d0 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
1b4e0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
1b4f0 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71  .    *pPgno = sq
1b500 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1b510 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1b520 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53   + 1;..#ifndef S
1b530 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1b540 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1b550 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20  t->nTrunc ){.   
1b560 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61     /* An incr-va
1b570 63 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79  cuum has already
1b580 20 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73   run within this
1b590 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
1b5a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
1b5b0 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69  ge to allocate i
1b5c0 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70  s not from the p
1b5d0 68 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74  hysical end of t
1b5e0 68 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20  he file, but.   
1b5f0 20 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54     ** at pBt->nT
1b600 72 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  runc. .      */.
1b610 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70        *pPgno = p
1b620 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20  Bt->nTrunc+1;.  
1b630 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
1b640 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1b650 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1b660 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
1b670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b680 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1b690 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
1b6a0 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
1b6b0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
1b6c0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
1b6d0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
1b6e0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
1b6f0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
1b700 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
1b710 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
1b720 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
1b730 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
1b740 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
1b750 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
1b760 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
1b770 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
1b780 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
1b790 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b7a0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1b7b0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
1b7c0 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
1b7d0 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
1b7e0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
1b7f0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1b800 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1b810 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70  Bt) );.      (*p
1b820 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Pgno)++;.    }. 
1b830 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1b840 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  nc ){.      pBt-
1b850 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f  >nTrunc = *pPgno
1b860 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1b870 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1b880 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1b890 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1b8a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b8b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1b8c0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1b8d0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1b8e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b8f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b900 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1b910 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1b920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b930 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1b940 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1b950 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
1b960 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1b970 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1b980 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1b990 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1b9a0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1b9b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1b9c0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
1b9d0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
1b9e0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
1b9f0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1ba00 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
1ba10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
1ba20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  a page of the da
1ba30 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74  tabase file to t
1ba40 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
1ba50 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1ba60 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61  nref() is NOT ca
1ba70 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a  lled for pPage..
1ba80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
1ba90 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
1baa0 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  pPage){.  BtShar
1bab0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1bac0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1bad0 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1bae0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c  Page1;.  int rc,
1baf0 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65   n, k;..  /* Pre
1bb00 70 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f  pare the page fo
1bb10 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61  r freeing */.  a
1bb20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
1bb30 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d  no>1 );.  pPage-
1bb40 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72  >isInit = 0;.  r
1bb50 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1bb60 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50  ->pParent);.  pP
1bb70 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
1bb80 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1bb90 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
1bba0 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
1bbb0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1bbc0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1bbd0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1bbe0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1bbf0 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  rc;.  n = get4by
1bc00 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1bc10 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
1bc20 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1bc30 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69  a[36], n+1);..#i
1bc40 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
1bc50 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
1bc60 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
1bc70 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
1bc80 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
1bc90 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
1bca0 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
1bcb0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
1bcc0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
1bcd0 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
1bce0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1bcf0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
1bd00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
1bd10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1bd20 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d  .  memset(pPage-
1bd30 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
1bd40 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
1bd50 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
1bd60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1bd70 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66  TOVACUUM.  /* If
1bd80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
1bd90 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
1bda0 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
1bdb0 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
1bdc0 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
1bdd0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1bde0 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
1bdf0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1be00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1be10 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
1be20 42 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  Bt, pPage->pgno,
1be30 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
1be40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1be50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1be60 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
1be70 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==0 ){.    /* T
1be80 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1be90 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20   free page */.  
1bea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1beb0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
1bec0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1bed0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1bee0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  ;.    memset(pPa
1bef0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38 29  ge->aData, 0, 8)
1bf00 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
1bf10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1bf20 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1bf30 0a 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45  .    TRACE(("FRE
1bf40 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72 73 74  E-PAGE: %d first
1bf50 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
1bf60 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1bf70 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65 20 70   /* Other free p
1bf80 61 67 65 73 20 61 6c 72 65 61 64 79 20 65 78 69  ages already exi
1bf90 73 74 2e 20 20 52 65 74 72 69 76 65 20 74 68 65  st.  Retrive the
1bfa0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
1bfb0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
1bfc0 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66 69 6e  freelist and fin
1bfd0 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c  d out how many l
1bfe0 65 61 76 65 73 20 69 74 20 68 61 73 2e 20 2a 2f  eaves it has. */
1bff0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  .    MemPage *pT
1c000 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  runk;.    rc = s
1c010 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1c020 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
1c030 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1c040 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30  32]), &pTrunk, 0
1c050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1c060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b  return rc;.    k
1c070 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1c080 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
1c090 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e      if( k>=pBt->
1c0a0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
1c0b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1c0c0 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20   trunk is full. 
1c0d0 20 54 75 72 6e 20 74 68 65 20 70 61 67 65 20 62   Turn the page b
1c0e0 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20  eing freed into 
1c0f0 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74  a new.      ** t
1c100 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e  runk page with n
1c110 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20  o leaves. */.   
1c120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c130 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
1c140 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1c150 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1c160 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62   rc;.      put4b
1c170 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1c180 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
1c190 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1c1a0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
1c1b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1c1c0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1c1d0 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1c1e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52 41  pgno);.      TRA
1c1f0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1c200 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
1c210 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
1c220 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c230 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54   pPage->pgno, pT
1c240 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
1c250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1c260 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
1c270 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
1c280 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
1c290 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
1c2a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c2b0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1c2c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1c2d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c2e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1c2f0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
1c300 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
1c310 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1c320 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1c330 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
1c340 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
1c350 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1c360 45 54 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ETE.        sqli
1c370 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1c380 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1c390 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1c3a0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
1c3b0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
1c3c0 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
1c3d0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
1c3e0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
1c3f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
1c400 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
1c410 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c420 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
1c430 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
1c440 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
1c450 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
1c460 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1c470 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
1c480 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
1c490 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
1c4a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1c4b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1c4c0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
1c4d0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
1c4e0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
1c4f0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  nt nOvfl;.  int 
1c500 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
1c510 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
1c520 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
1c530 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1c540 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
1c550 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
1c560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c570 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
1c580 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
1c590 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1c5a0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
1c5b0 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
1c5c0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
1c5d0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76  Overflow]);.  ov
1c5e0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
1c5f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1c600 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
1c610 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
1c620 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
1c630 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
1c640 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
1c650 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
1c660 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
1c670 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
1c680 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
1c690 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
1c6a0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76  vflPgno==0 || ov
1c6b0 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  flPgno>sqlite3Pa
1c6c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1c6d0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
1c6e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c6f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c700 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67     }..    rc = g
1c710 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
1c720 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
1c730 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29  Ovfl, (nOvfl==0)
1c740 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  ?0:&ovflPgno);. 
1c750 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1c760 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
1c770 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
1c780 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1c790 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
1c7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1c7b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1c7c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1c7d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c7e0 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
1c7f0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
1c800 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
1c810 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
1c820 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
1c830 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
1c840 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
1c850 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
1c860 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
1c870 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
1c880 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
1c890 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1c8a0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
1c8b0 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1c8c0 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
1c8d0 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
1c8e0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
1c8f0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
1c900 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
1c910 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
1c920 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
1c930 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
1c940 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
1c950 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
1c960 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
1c970 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
1c980 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
1c990 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
1c9a0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
1c9b0 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
1c9c0 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
1c9d0 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
1c9e0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
1c9f0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
1ca00 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1ca10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1ca20 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1ca30 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
1ca40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
1ca50 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
1ca60 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
1ca70 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
1ca80 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1ca90 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
1caa0 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
1cab0 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
1cac0 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
1cad0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
1cae0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb00 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
1cb10 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
1cb20 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
1cb30 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
1cb40 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1cb50 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
1cb60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
1cb70 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
1cb80 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
1cb90 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
1cba0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
1cbb0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
1cbc0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
1cbd0 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
1cbe0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
1cbf0 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
1cc00 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
1cc10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1cc20 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1cc30 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
1cc40 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
1cc50 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
1cc60 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  fo;..  /* Fill i
1cc70 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
1cc80 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
1cc90 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1cca0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
1ccb0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
1ccc0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1ccd0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
1cce0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
1ccf0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
1cd00 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
1cd10 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
1cd20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
1cd30 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
1cd40 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
1cd50 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
1cd60 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
1cd70 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
1cd80 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1cd90 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
1cda0 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
1cdb0 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
1cdc0 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
1cdd0 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
1cde0 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44  ( info.nData==nD
1cdf0 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a  ata+nZero );.  .
1ce00 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
1ce10 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
1ce20 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
1ce30 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
1ce40 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1ce50 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
1ce60 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
1ce70 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
1ce80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1ce90 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
1cea0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
1ceb0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65  ;.    nSrc = nKe
1cec0 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
1ced0 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
1cee0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
1cef0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
1cf00 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
1cf10 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
1cf20 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
1cf30 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
1cf40 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
1cf50 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
1cf60 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
1cf70 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20 30   int isExact = 0
1cf80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1cf90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1cfa0 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
1cfb0 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
1cfc0 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
1cfd0 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
1cfe0 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
1cff0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1d000 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
1d010 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
1d020 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
1d030 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
1d040 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
1d050 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
1d060 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
1d070 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
1d080 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
1d090 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1d0a0 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a  ( pgnoOvfl>1 ){.
1d0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 45            /* isE
1d0c0 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20  xact = 1; */.   
1d0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1d0e0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1d0f0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1d100 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
1d110 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
1d120 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a 23  vfl, isExact);.#
1d130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d140 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1d150 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
1d160 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1d170 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
1d180 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
1d190 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
1d1a0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
1d1b0 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
1d1c0 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
1d1d0 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
1d1e0 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
1d1f0 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
1d200 20 54 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   The entry for t
1d210 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1d220 77 20 70 61 67 65 20 77 69 6c 6c 20 62 65 0a 20  w page will be. 
1d230 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 6c 61       ** added la
1d240 74 65 72 2c 20 62 79 20 74 68 65 20 69 6e 73 65  ter, by the inse
1d250 72 74 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65  rtCell() routine
1d260 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d270 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1d280 63 75 75 6d 20 26 26 20 70 67 6e 6f 50 74 72 6d  cuum && pgnoPtrm
1d290 61 70 21 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  ap!=0 && rc==SQL
1d2a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d2b0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
1d2c0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
1d2d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d2e0 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20  , pgnoPtrmap);. 
1d2f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1d300 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d310 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d320 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
1d330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d350 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
1d360 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
1d370 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1d380 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
1d390 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
1d3a0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
1d3b0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
1d3c0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1d3d0 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
1d3e0 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
1d3f0 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
1d400 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
1d410 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1d420 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
1d430 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
1d440 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
1d450 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
1d460 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63  ft;.    if( nSrc
1d470 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
1d480 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
1d490 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
1d4a0 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
1d4b0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1d4c0 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
1d4d0 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
1d4e0 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
1d4f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
1d500 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
1d510 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
1d520 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
1d530 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
1d540 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
1d550 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
1d560 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
1d570 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
1d580 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
1d590 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
1d5a0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
1d5b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d5c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
1d5d0 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65  ange the MemPage
1d5e0 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72  .pParent pointer
1d5f0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f   on the page who
1d600 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  se number is.** 
1d610 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
1d620 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20  ond argument so 
1d630 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61  that MemPage.pPa
1d640 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  rent holds the.*
1d650 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
1d660 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e   third argument.
1d670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1d680 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53 68  eparentPage(BtSh
1d690 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1d6a0 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70  pgno, MemPage *p
1d6b0 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69  NewParent, int i
1d6c0 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dx){.  MemPage *
1d6d0 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20  pThis;.  DbPage 
1d6e0 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
1d6f0 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21  ert( pNewParent!
1d700 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  =0 );.  if( pgno
1d710 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1d720 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1d730 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ( pBt->pPager!=0
1d740 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
1d750 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1d760 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
1d770 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
1d780 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69  Page ){.    pThi
1d790 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  s = (MemPage *)s
1d7a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1d7b0 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
1d7c0 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49    if( pThis->isI
1d7d0 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nit ){.      ass
1d7e0 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74  ert( pThis->aDat
1d7f0 61 3d 3d 28 73 71 6c 69 74 65 33 50 61 67 65 72  a==(sqlite3Pager
1d800 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
1d810 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1d820 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70  This->pParent!=p
1d830 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  NewParent ){.   
1d840 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
1d850 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65  pParent ) sqlite
1d860 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68 69  3PagerUnref(pThi
1d870 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  s->pParent->pDbP
1d880 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 54  age);.        pT
1d890 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  his->pParent = p
1d8a0 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
1d8b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1d8c0 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70  ef(pNewParent->p
1d8d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
1d8e0 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64  .      pThis->id
1d8f0 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20  xParent = idx;. 
1d900 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1d910 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1d920 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ge);.  }..#ifnde
1d930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d940 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
1d950 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1d960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  {.    return ptr
1d970 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
1d980 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1d990 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  pNewParent->pgno
1d9a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1d9b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d9c0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;.}..../*.** Cha
1d9d0 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20  nge the pParent 
1d9e0 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63  pointer of all c
1d9f0 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65  hildren of pPage
1da00 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a   to point back.*
1da10 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  * to pPage..**.*
1da20 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1da30 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c  , for every chil
1da40 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f  d of pPage, invo
1da50 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  ke reparentPage(
1da60 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72  ).** to make sur
1da70 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c  e that each chil
1da80 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61  d knows that pPa
1da90 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  ge is its parent
1daa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1dab0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1dac0 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70   after you memcp
1dad0 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74  y() one page int
1dae0 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f  o.** another..*/
1daf0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61  .static int repa
1db00 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d  rentChildPages(M
1db10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1db20 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61    int i;.  BtSha
1db30 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1db40 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1db50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1db60 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1db70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1db80 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  OK;..  for(i=0; 
1db90 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
1dba0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1dbb0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1dbc0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
1dbd0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1dbe0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 70  {.      rc = rep
1dbf0 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
1dc00 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
1dc10 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
1dc20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dc30 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1dc40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1dc50 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dc60 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
1dc70 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  tPage(pBt, get4b
1dc80 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1dc90 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1dca0 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20  et+8]), .       
1dcb0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70  pPage, i);.    p
1dcc0 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
1dcd0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1dce0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1dcf0 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
1dd00 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
1dd10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
1dd20 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
1dd30 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
1dd40 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
1dd50 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
1dd60 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
1dd70 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
1dd80 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
1dd90 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
1dda0 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
1ddb0 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
1ddc0 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
1ddd0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
1dde0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
1ddf0 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
1de00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1de10 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
1de20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1de30 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
1de40 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
1de50 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e  x, int sz){.  in
1de60 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
1de70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1de80 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
1de90 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
1dea0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
1deb0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
1dec0 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
1ded0 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
1dee0 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
1def0 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
1df00 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
1df10 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
1df20 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
1df30 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
1df40 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
1df50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1df60 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
1df70 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
1df80 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1df90 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1dfa0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1dfb0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
1dfc0 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
1dfd0 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
1dfe0 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
1dff0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
1e000 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
1e010 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
1e020 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
1e030 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
1e040 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
1e050 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
1e060 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
1e070 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
1e080 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
1e090 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
1e0a0 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
1e0b0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
1e0c0 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
1e0d0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1e0e0 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
1e0f0 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
1e100 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
1e110 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
1e120 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
1e130 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
1e140 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
1e150 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
1e160 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
1e170 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
1e180 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
1e190 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
1e1a0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
1e1b0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
1e1c0 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
1e1d0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
1e1e0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
1e1f0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
1e200 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
1e210 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
1e220 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
1e230 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
1e240 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
1e250 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
1e260 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
1e270 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
1e280 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
1e290 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
1e2a0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
1e2b0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
1e2c0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
1e2d0 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
1e2e0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
1e2f0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
1e300 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
1e310 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
1e320 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
1e330 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
1e340 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
1e350 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
1e360 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
1e370 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
1e380 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
1e390 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
1e3a0 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
1e3b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1e3c0 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
1e3d0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
1e3e0 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
1e3f0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
1e400 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
1e410 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
1e420 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
1e430 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
1e440 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
1e450 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
1e460 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
1e470 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
1e480 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
1e490 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
1e4a0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
1e4b0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
1e4c0 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
1e4d0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
1e4e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
1e4f0 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
1e500 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
1e510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1e520 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
1e530 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
1e540 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
1e550 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
1e560 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
1e570 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
1e580 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
1e590 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
1e5a0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
1e5b0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
1e5c0 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
1e5d0 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
1e5e0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
1e5f0 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
1e600 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
1e610 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
1e620 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1e630 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
1e640 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1e650 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
1e660 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
1e670 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
1e680 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
1e690 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
1e6a0 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
1e6b0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
1e6c0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
1e6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e6e0 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
1e6f0 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
1e700 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
1e710 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
1e720 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e730 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
1e740 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
1e750 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
1e760 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
1e770 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
1e780 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
1e790 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
1e7a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1e7b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
1e7c0 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
1e7d0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
1e7e0 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
1e7f0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
1e800 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
1e810 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
1e820 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
1e830 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
1e840 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
1e850 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
1e860 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1e870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1e880 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1e890 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1e8a0 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1e8b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
1e8c0 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
1e8d0 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
1e8e0 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
1e8f0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
1e900 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
1e910 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
1e920 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
1e930 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
1e940 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
1e950 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
1e960 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  <sizeof(pPage->a
1e970 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
1e980 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b  ge->aOvfl[0]) );
1e990 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
1e9a0 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
1e9b0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
1e9c0 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b  Ovfl[j].idx = i;
1e9d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
1e9e0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1e9f0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
1ea00 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
1ea10 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
1ea20 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
1ea30 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
1ea40 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
1ea50 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
1ea60 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
1ea70 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
1ea80 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
1ea90 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
1eaa0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
1eab0 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
1eac0 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
1ead0 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66 72 61    int rc = defra
1eae0 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
1eaf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1eb00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1eb10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70  rn rc;.      top
1eb20 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
1eb30 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
1eb40 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
1eb50 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
1eb60 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
1eb70 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
1eb80 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
1eb90 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
1eba0 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
1ebb0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
1ebc0 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  +5]) );.    pPag
1ebd0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
1ebe0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
1ebf0 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
1ec00 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
1ec10 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
1ec20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
1ec30 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
1ec40 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
1ec50 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
1ec60 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
1ec70 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
1ec80 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
1ec90 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
1eca0 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
1ecb0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
1ecc0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
1ecd0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
1ece0 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
1ecf0 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
1ed00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ed10 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
1ed20 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
1ed30 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
1ed40 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
1ed50 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
1ed60 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1ed70 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
1ed80 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
1ed90 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
1eda0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
1edb0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
1edc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65       */.      Ce
1edd0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1ede0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
1edf0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
1ee00 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1ee10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ee20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
1ee30 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
1ee40 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
1ee50 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20  Payload );.     
1ee60 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
1ee70 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
1ee80 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
1ee90 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1eea0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76       Pgno pgnoOv
1eeb0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
1eec0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
1eed0 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  low]);.        i
1eee0 6e 74 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75  nt rc = ptrmapPu
1eef0 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
1ef00 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
1ef10 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
1ef20 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1ef30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ef40 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1ef50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
1ef60 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
1ef70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ef80 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
1ef90 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
1efa0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
1efb0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
1efc0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
1efd0 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
1efe0 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
1eff0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
1f000 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
1f010 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
1f020 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
1f030 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
1f040 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
1f050 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
1f060 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1f070 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
1f080 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1f090 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
1f0a0 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
1f0b0 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
1f0c0 20 69 6e 74 20 2a 61 53 69 7a 65 20 20 20 20 20   int *aSize     
1f0d0 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
1f0e0 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
1f0f0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1f100 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1f110 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61  er */.  int tota
1f120 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74  lSize;    /* Tot
1f130 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
1f140 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ells */.  int hd
1f150 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
1f160 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61  ndex of page hea
1f170 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
1f180 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64  lptr;      /* Ad
1f190 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
1f1a0 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
1f1b0 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
1f1c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1f1d0 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
1f1e0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
1f1f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
1f200 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  r the page */.. 
1f210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1f220 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
1f230 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b    totalSize = 0;
1f240 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1f250 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74  ell; i++){.    t
1f260 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a  otalSize += aSiz
1f270 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  e[i];.  }.  asse
1f280 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a  rt( totalSize+2*
1f290 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46  nCell<=pPage->nF
1f2a0 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ree );.  assert(
1f2b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
1f2c0 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20   );.  cellptr = 
1f2d0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
1f2e0 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
1f2f0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
1f300 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
1f310 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  et;.  put2byte(&
1f320 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
1f330 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ll);.  if( nCell
1f340 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   ){.    cellbody
1f350 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
1f360 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a  (pPage, totalSiz
1f370 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
1f380 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20  cellbody>0 );.  
1f390 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1f3a0 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c  >nFree >= 2*nCel
1f3b0 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l );.    pPage->
1f3c0 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c  nFree -= 2*nCell
1f3d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1f3e0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1f3f0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
1f400 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c  ta[cellptr], cel
1f410 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65  lbody);.      me
1f420 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
1f430 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
1f440 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20   aSize[i]);.    
1f450 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a    cellptr += 2;.
1f460 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b        cellbody +
1f470 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
1f480 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  }.    assert( ce
1f490 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70  llbody==pPage->p
1f4a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
1f4b0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
1f4c0 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a  Cell = nCell;.}.
1f4d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1f4e0 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
1f4f0 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
1f500 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
1f510 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
1f520 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
1f530 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
1f540 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1f550 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
1f560 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
1f570 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
1f580 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
1f590 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
1f5a0 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
1f5b0 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
1f5c0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
1f5d0 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
1f5e0 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
1f5f0 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
1f600 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
1f610 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
1f620 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
1f630 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
1f640 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
1f650 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
1f660 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
1f670 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
1f680 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
1f690 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
1f6a0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
1f6b0 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
1f6c0 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
1f6d0 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
1f6e0 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
1f6f0 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
1f700 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
1f710 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
1f720 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
1f730 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
1f740 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
1f750 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
1f760 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
1f770 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
1f780 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
1f790 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
1f7a0 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
1f7b0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
1f7c0 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
1f7d0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
1f7e0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
1f7f0 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a  MemPage*, int);.
1f800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f810 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
1f820 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
1f830 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
1f840 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
1f850 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
1f860 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
1f870 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
1f880 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
1f890 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
1f8a0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
1f8b0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
1f8c0 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
1f8d0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
1f8e0 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
1f8f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
1f900 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
1f910 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e   of trying balan
1f920 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
1f930 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
1f940 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
1f950 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
1f960 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
1f970 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
1f980 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
1f990 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
1f9a0 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
1f9b0 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
1f9c0 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
1f9d0 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
1f9e0 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
1f9f0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
1fa00 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
1fa10 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
1fa20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
1fa30 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
1fa40 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
1fa50 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
1fa60 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
1fa70 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
1fa80 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
1fa90 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
1faa0 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
1fab0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
1fac0 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
1fad0 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
1fae0 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
1faf0 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
1fb00 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
1fb10 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
1fb20 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1fb30 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
1fb40 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ck(MemPage *pPag
1fb50 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  e, MemPage *pPar
1fb60 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
1fb70 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
1fb80 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
1fb90 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
1fba0 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65  int szCell;.  Ce
1fbb0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42  llInfo info;.  B
1fbc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fbd0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
1fbe0 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61   parentIdx = pPa
1fbf0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f  rent->nCell;   /
1fc00 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69  * pParent new di
1fc10 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78  vider cell index
1fc20 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
1fc30 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1fc40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1fc50 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  of new divider c
1fc60 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65  ell */.  u8 pare
1fc70 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20  ntCell[64];     
1fc80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1fc90 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
1fca0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
1fcb0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1fcc0 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72   new page. Inser
1fcd0 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  t the overflow c
1fce0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20  ell from pPage. 
1fcf0 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65   ** into it. The
1fd00 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65  n remove the ove
1fd10 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
1fd20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  pPage..  */.  rc
1fd30 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1fd40 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
1fd50 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
1fd60 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1fd70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1fd80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
1fd90 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
1fda0 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73  fl[0].pCell;.  s
1fdb0 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
1fdc0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1fdd0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  );.  zeroPage(pN
1fde0 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
1fdf0 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65  [0]);.  assemble
1fe00 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
1fe10 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
1fe20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
1fe30 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  ow = 0;..  /* Se
1fe40 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  t the parent of 
1fe50 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1fe60 74 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72  ted page to pPar
1fe70 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  ent. */.  pNew->
1fe80 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
1fe90 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
1fea0 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
1feb0 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50  bPage);..  /* pP
1fec0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
1fed0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
1fee0 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
1fef0 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f  nge this.  ** so
1ff00 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
1ff10 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77  child is the new
1ff20 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   page allocated 
1ff30 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70  above and.  ** p
1ff40 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74  Page is the next
1ff50 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e  -to-right child.
1ff60 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
1ff70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
1ff80 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  );.  pCell = fin
1ff90 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
1ffa0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
1ffb0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1ffc0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
1ffd0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1ffe0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
1fff0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
20000 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
20010 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
20020 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28  rentSize);.  if(
20030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20040 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
20050 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
20060 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a  arentSize<64 );.
20070 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
20080 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  l(pParent, paren
20090 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c  tIdx, parentCell
200a0 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c  , parentSize, 0,
200b0 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   4);.  if( rc!=S
200c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
200d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
200e0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
200f0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
20100 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70  nt,parentIdx), p
20110 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70  Page->pgno);.  p
20120 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
20130 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
20140 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
20150 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65  gnoNew);..#ifnde
20160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20170 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66  TOVACUUM.  /* If
20180 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
20190 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
201a0 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
201b0 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69  nter map.  ** wi
201c0 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
201d0 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
201e0 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
201f0 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c  m the .  ** cell
20200 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
20210 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
20220 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
20230 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
20240 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
20250 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
20260 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
20270 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
20280 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
202a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
202b0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
202c0 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a  tOvfl(pNew, 0);.
202d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
202e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
202f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20300 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
20310 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
20320 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
20330 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e  w page and balan
20340 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
20350 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ge,.  ** in case
20360 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
20370 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65  l inserted cause
20380 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f  d it to become o
20390 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  verfull..  */.  
203a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
203b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61  );.  return bala
203c0 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  nce(pParent, 0);
203d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
203e0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
203f0 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LANCE */../*.** 
20400 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
20410 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73  istributes Cells
20420 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70   on pPage and up
20430 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67   to NN*2 sibling
20440 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f  s.** of pPage so
20450 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
20460 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73  have about the s
20470 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
20480 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75  ee space..** Usu
20490 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73  ally NN siblings
204a0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
204b0 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64  of pPage is used
204c0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
204d0 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72  g,.** though mor
204e0 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  e siblings might
204f0 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73   come from one s
20500 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20  ide if pPage is 
20510 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20  the first.** or 
20520 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
20530 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50  s parent.  If pP
20540 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68  age has fewer th
20550 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73  an 2*NN siblings
20560 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  .** (something w
20570 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
20580 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73  ppen if pPage is
20590 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
205a0 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66  r a .** child of
205b0 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20   root) then all 
205c0 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
205d0 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69  gs participate i
205e0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
205f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
20600 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
20610 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20   pPage might be 
20620 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
20630 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72  reased by one or
20640 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66  .** two in an ef
20650 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
20660 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
20670 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
20680 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  . The root page.
20690 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e  ** is special an
206a0 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  d is allowed to 
206b0 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
206c0 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a   If pPage is .**
206d0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
206e0 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f  then the depth o
206f0 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74  f the tree might
20700 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a   be increased.**
20710 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
20720 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61   one, as necessa
20730 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20  ry, to keep the 
20740 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62  root page from b
20750 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  eing.** overfull
20760 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   or completely e
20770 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  mpty..**.** Note
20780 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
20790 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
207a0 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43  d, some of the C
207b0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a  ells on pPage.**
207c0 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
207d0 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
207e0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
207f0 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
20800 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
20810 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50   is overfull.  P
20820 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f  art of the job o
20830 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
20840 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72  s to.** make sur
20850 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20  e all Cells for 
20860 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e  pPage once again
20870 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61   fit in pPage->a
20880 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e  Data[]..**.** In
20890 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
208a0 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62  alancing the sib
208b0 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20  lings of pPage, 
208c0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  the parent of pP
208d0 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63  age.** might bec
208e0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
208f0 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74  underfull.  If t
20900 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65  hat happens, the
20910 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
20920 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  * is called recu
20930 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70  rsively on the p
20940 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arent..**.** If 
20950 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
20960 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
20970 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
20980 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
20990 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
209a0 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74   state.  So if t
209b0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
209c0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
209d0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
209e0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
209f0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
20a00 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20  nonroot(MemPage 
20a10 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61  *pPage){.  MemPa
20a20 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ge *pParent;    
20a30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20a40 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a  arent of pPage *
20a50 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
20a60 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
20a70 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
20a80 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
20a90 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
20aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20ab0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
20ac0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
20ad0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
20ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
20af0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
20b00 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
20b10 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
20b20 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
20b30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20b40 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
20b50 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Old[] */.  int n
20b60 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
20b70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20b80 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
20b90 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
20ba0 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
20bb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20bc0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
20bd0 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Div[] */.  int i
20be0 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
20bf0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20c00 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
20c10 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
20c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20c30 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20  dex of pPage in 
20c40 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
20c50 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c70 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
20c80 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
20c90 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
20ca0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20cc0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
20cd0 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f   */.  int leafCo
20ce0 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
20cf0 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
20d00 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
20d10 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
20d20 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
20d30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20d40 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
20d50 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
20d60 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
20d70 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
20d80 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
20d90 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
20da0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
20db0 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20dd0 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
20de0 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
20df0 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
20e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20e10 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
20e20 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
20e30 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
20e40 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
20e50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
20e60 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
20e70 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65  aSpace[] */.  Me
20e80 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
20e90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
20ea0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
20eb0 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
20ec0 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d  Pgno pgnoOld[NB]
20ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20ee0 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
20ef0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
20f00 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  Old[] */.  MemPa
20f10 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
20f20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
20f30 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
20f40 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
20f50 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
20f60 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
20f70 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
20f80 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
20f90 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
20fa0 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42   Pgno pgnoNew[NB
20fb0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  +2];          /*
20fc0 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
20fd0 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
20fe0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  pNew[] */.  u8 *
20ff0 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  apDiv[NB];      
21000 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
21010 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
21020 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
21030 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
21040 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
21050 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
21060 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
21070 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
21080 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
21090 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
210a0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
210b0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
210c0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
210d0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
210e0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
210f0 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
21100 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c  */.  int *szCell
21110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21120 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
21130 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
21140 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
21150 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20   *aCopy[NB];    
21160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
21170 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
21180 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
21190 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
211a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
211b0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
211c0 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69  old copies of di
211d0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
211e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
211f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
21200 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a   u8 *aFrom = 0;.
21210 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a 20 20  #endif..  /* .  
21220 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
21230 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
21240 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
21250 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
21260 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
21270 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
21280 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
21290 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
212a0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
212b0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
212c0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
212d0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
212e0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
212f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
21300 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29  ent->pDbPage)) )
21310 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
21320 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
21330 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
21340 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
21350 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
21360 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
21370 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
21380 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
21390 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  LANCE.  /*.  ** 
213a0 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20  A special case: 
213b0 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20   If a new entry 
213c0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e  has just been in
213d0 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20  serted into a.  
213e0 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69  ** table (that i
213f0 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20  s, a btree with 
21400 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64  integer keys and
21410 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65   all data at the
21420 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e   leaves).  ** an
21430 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
21440 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
21450 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
21460 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a  ree (it has the.
21470 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
21480 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73  ) then use the s
21490 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71  pecial balance_q
214a0 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  uick() routine f
214b0 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  or.  ** balancin
214c0 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  g.  balance_quic
214d0 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74  k() is much fast
214e0 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69  er and results i
214f0 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a  n a tighter.  **
21500 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61   packing of data
21510 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
21520 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
21530 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20  pPage->leaf &&. 
21540 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
21550 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ey &&.      pPag
21560 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20  e->leafData &&. 
21570 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
21580 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20  rflow==1 &&.    
21590 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30    pPage->aOvfl[0
215a0 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
215b0 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61  ell &&.      pPa
215c0 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
215d0 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65  o!=1 &&.      ge
215e0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
215f0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
21600 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
21610 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a  Page->pgno.  ){.
21620 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f      /*.    ** TO
21630 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69  DO: Check the si
21640 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65  blings to the le
21650 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20  ft of pPage. It 
21660 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20  may be that.    
21670 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ** they are not 
21680 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20  full and no new 
21690 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
216a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
216b0 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  urn balance_quic
216c0 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  k(pPage, pParent
216d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
216e0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
216f0 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
21700 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
21710 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
21720 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
21730 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
21740 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
21750 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
21760 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
21770 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
21780 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
21790 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
217a0 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
217b0 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28  Cell .  */.  if(
217c0 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69   pParent->idxShi
217d0 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  ft ){.    Pgno p
217e0 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  gno;.    pgno = 
217f0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pPage->pgno;.   
21800 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73   assert( pgno==s
21810 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
21820 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
21830 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72  Page) );.    for
21840 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72  (idx=0; idx<pPar
21850 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b  ent->nCell; idx+
21860 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65  +){.      if( ge
21870 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
21880 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d  pParent, idx))==
21890 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
218a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
218b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
218c0 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
218d0 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ell.            
218e0 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
218f0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
21900 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
21910 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d  8])==pgno );.  }
21920 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20  else{.    idx = 
21930 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
21940 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
21950 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69   Initialize vari
21960 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74  ables so that it
21970 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f   will be safe to
21980 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63   jump.  ** direc
21990 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63  tly to balance_c
219a0 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f  leanup at any mo
219b0 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c  ment..  */.  nOl
219c0 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20  d = nNew = 0;.  
219d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
219e0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
219f0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  );..  /*.  ** Fi
21a00 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  nd sibling pages
21a10 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68   to pPage and th
21a20 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
21a30 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20  nt that divide. 
21a40 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73   ** the siblings
21a50 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  .  An attempt is
21a60 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
21a70 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
21a80 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66  her.  ** side of
21a90 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69   pPage.  More si
21aa0 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
21ab0 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
21ac0 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a  however, if.  **
21ad0 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65   pPage there are
21ae0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
21af0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
21b00 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70  ther side.  If p
21b10 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
21b20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
21b30 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
21b40 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
21b50 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a  t are taken..  *
21b60 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20  /.  nxDiv = idx 
21b70 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69  - NN;.  if( nxDi
21b80 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74  v + NB > pParent
21b90 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  ->nCell ){.    n
21ba0 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e  xDiv = pParent->
21bb0 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a  nCell - NB + 1;.
21bc0 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c    }.  if( nxDiv<
21bd0 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  0 ){.    nxDiv =
21be0 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d   0;.  }.  nDiv =
21bf0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b   0;.  for(i=0, k
21c00 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b  =nxDiv; i<NB; i+
21c10 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, k++){.    if(
21c20 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   k<pParent->nCel
21c30 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  l ){.      apDiv
21c40 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
21c50 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20  Parent, k);.    
21c60 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20    nDiv++;.      
21c70 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74  assert( !pParent
21c80 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  ->leaf );.      
21c90 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
21ca0 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
21cb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
21cc0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
21cd0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   ){.      pgnoOl
21ce0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
21cf0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
21d00 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
21d10 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
21d20 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
21d30 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
21d40 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
21d50 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26  t, pgnoOld[i], &
21d60 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e  apOld[i], pParen
21d70 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
21d80 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
21d90 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64  eanup;.    apOld
21da0 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
21db0 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69   k;.    apCopy[i
21dc0 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ] = 0;.    asser
21dd0 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20  t( i==nOld );.  
21de0 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d    nOld++;.    nM
21df0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
21e00 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
21e10 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
21e20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
21e30 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
21e40 74 69 70 6c 65 20 6f 66 20 32 20 69 6e 20 6f 72  tiple of 2 in or
21e50 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
21e60 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
21e70 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
21e80 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
21e90 73 20 2b 20 31 29 26 7e 31 3b 0a 0a 20 20 2f 2a  s + 1)&~1;..  /*
21ea0 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
21eb0 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
21ec0 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
21ed0 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
21ee0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 0a 20 20 20  eMallocRaw( .   
21ef0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
21f00 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
21f30 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
21f40 73 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20  s*sizeof(int)   
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f60 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
21f70 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55 4e  l */.     + ROUN
21f80 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
21f90 65 29 29 2a 4e 42 20 20 20 20 20 20 20 20 20 20  e))*NB          
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
21fb0 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Copy */.     + p
21fc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35 2b  Bt->pageSize*(5+
21fd0 4e 42 29 20 20 20 20 20 20 20 20 20 20 20 20 20  NB)             
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ff0 2a 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20 20  * aSpace */.    
22000 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d   + (ISAUTOVACUUM
22010 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30   ? nMaxCells : 0
22020 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
22030 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20     /* aFrom */. 
22040 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
22050 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
22060 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22070 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
22080 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
22090 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70  Cell = (int*)&ap
220a0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
220b0 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75  .  aCopy[0] = (u
220c0 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
220d0 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
220e0 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75   ((aCopy[0] - (u
220f0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
22100 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
22110 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
22120 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
22130 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
22140 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
22150 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
22160 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
22170 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
22180 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
22190 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70  opy[i] - (u8*)ap
221a0 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
221b0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
221c0 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
221d0 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20  .  }.  aSpace = 
221e0 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74  &aCopy[NB-1][pBt
221f0 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
22200 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
22210 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ))];.  assert( (
22220 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61  (aSpace - (u8*)a
22230 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
22240 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
22250 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
22260 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22270 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
22280 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
22290 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46  Vacuum ){.    aF
222a0 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a  rom = &aSpace[5*
222b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
222c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
222d0 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70  /*.  ** Make cop
222e0 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ies of the conte
222f0 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20  nt of pPage and 
22300 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74  its siblings int
22310 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54  o aOld[]..  ** T
22320 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
22330 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  function will us
22340 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
22350 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20  copies rather.  
22360 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
22370 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
22380 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
22390 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
223a0 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  he.  ** process 
223b0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
223c0 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tten..  */.  for
223d0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
223e0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
223f0 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  *p = apCopy[i] =
22400 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 43 6f 70   (MemPage*)&aCop
22410 79 5b 69 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  y[i][pBt->pageSi
22420 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  ze];.    p->aDat
22430 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70  a = &((u8*)p)[-p
22440 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
22450 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61     memcpy(p->aDa
22460 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
22470 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
22480 7a 65 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 50  ze + sizeof(MemP
22490 61 67 65 29 29 3b 0a 20 20 20 20 2f 2a 20 54 68  age));.    /* Th
224a0 65 20 6d 65 6d 63 70 79 28 29 20 61 62 6f 76 65  e memcpy() above
224b0 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
224c0 75 65 20 6f 66 20 70 2d 3e 61 44 61 74 61 20 73  ue of p->aData s
224d0 6f 20 77 65 20 68 61 76 65 20 74 6f 0a 20 20 20  o we have to.   
224e0 20 2a 2a 20 73 65 74 20 69 74 20 61 67 61 69 6e   ** set it again
224f0 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 44 61 74  . */.    p->aDat
22500 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70  a = &((u8*)p)[-p
22510 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
22520 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
22530 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
22540 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
22550 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
22560 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
22570 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
22580 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
22590 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
225a0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
225b0 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
225c0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
225d0 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64  orm aSpace[] and
225e0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
225f0 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
22600 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
22610 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
22620 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
22630 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
22640 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
22650 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
22660 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
22670 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
22680 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
22690 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
226a0 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
226b0 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ace[].  In this 
226c0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
226d0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
226e0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
226f0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
22700 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
22710 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
22720 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
22730 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
22740 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
22750 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
22760 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
22770 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
22780 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
22790 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
227a0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
227b0 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
227c0 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
227d0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
227e0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
227f0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
22800 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
22810 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
22820 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
22830 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
22840 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
22850 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
22860 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
22870 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66  pPage->leaf;.  f
22880 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
22890 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
228a0 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
228b0 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
228c0 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
228d0 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
228e0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
228f0 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
22900 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
22910 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
22920 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
22930 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
22940 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
22950 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
22960 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
22970 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
22980 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20  Cell]);.#ifndef 
22990 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
229a0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
229b0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
229c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
229d0 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
229e0 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20  [nCell] = i;.   
229f0 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c       for(a=0; a<
22a00 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
22a10 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   a++){.         
22a20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c   if( pOld->aOvfl
22a30 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c  [a].pCell==apCel
22a40 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20  l[nCell] ){.    
22a50 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
22a60 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
22a70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22a80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22a90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
22aa0 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c  ndif.      nCell
22ab0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
22ac0 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
22ad0 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c      int sz = cel
22ae0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
22af0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
22b00 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
22b10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
22b20 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
22b30 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
22b40 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
22b50 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
22b60 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
22b70 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
22b80 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
22b90 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
22ba0 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
22bb0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
22bc0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
22bd0 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
22be0 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
22bf0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
22c00 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
22c10 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
22c20 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
22c30 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
22c40 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
22c50 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
22c60 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
22c70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
22c80 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
22c90 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
22ca0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
22cb0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
22cc0 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
22cd0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
22ce0 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
22cf0 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
22d00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
22d10 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
22d20 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
22d30 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
22d40 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
22d50 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
22d60 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
22d70 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e  Correction;.#ifn
22d80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22d90 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
22da0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
22db0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
22dc0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
22dd0 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
22de0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
22df0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
22e00 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
22e10 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
22e20 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72  Cell] -= leafCor
22e30 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
22e40 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
22e50 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
22e60 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
22e70 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
22e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
22e90 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
22ea0 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
22eb0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
22ec0 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
22ed0 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
22ee0 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
22ef0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
22f00 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
22f10 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
22f20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
22f30 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
22f40 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
22f50 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
22f60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22f70 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22f80 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
22f90 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
22fa0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
22fb0 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
22fc0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
22fd0 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
22fe0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
22ff0 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
23000 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
23010 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  ] = 4;.         
23020 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23030 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
23040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23050 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
23060 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
23070 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
23080 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
23090 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
230a0 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
230b0 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
230c0 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
230d0 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
230e0 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
230f0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
23100 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
23110 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
23120 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
23130 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
23140 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
23150 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
23160 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
23170 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
23180 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
23190 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
231a0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
231b0 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
231c0 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
231d0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
231e0 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
231f0 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
23200 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
23210 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
23220 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
23230 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
23240 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
23250 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
23260 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
23270 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
23280 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
23290 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
232a0 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
232b0 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
232c0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
232d0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
232e0 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
232f0 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
23300 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
23310 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
23320 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
23330 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
23340 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
23350 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
23360 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
23370 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
23380 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
23390 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
233a0 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
233b0 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
233c0 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
233d0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
233e0 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
233f0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
23400 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
23410 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
23420 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
23430 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
23440 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
23450 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
23460 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
23470 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
23480 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
23490 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
234a0 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
234b0 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
234c0 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
234d0 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
234e0 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
234f0 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
23500 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
23510 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
23520 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
23530 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
23540 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
23550 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
23560 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
23570 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
23580 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
23590 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
235a0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
235b0 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
235c0 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
235d0 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
235e0 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
235f0 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
23600 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
23610 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
23620 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
23630 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
23640 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
23650 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
23660 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
23670 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
23680 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
23690 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
236a0 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
236b0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
236c0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
236d0 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
236e0 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
236f0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
23700 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
23710 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
23720 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
23730 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
23740 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
23750 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
23760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23770 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
23780 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
23790 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
237a0 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
237b0 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
237c0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
237d0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
237e0 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
237f0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
23800 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
23810 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
23820 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
23830 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
23840 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
23850 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
23860 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
23870 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
23880 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
23890 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
238a0 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
238b0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
238c0 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
238d0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
238e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
238f0 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
23900 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
23910 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
23920 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
23930 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
23940 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
23950 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65  0) or we are the
23960 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
23970 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
23980 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
23990 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
239a0 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
239b0 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
239c0 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
239d0 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
239e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
239f0 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
23a00 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
23a10 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
23a20 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  ell==0) );..  /*
23a30 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
23a40 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
23a50 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
23a60 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
23a70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
23a80 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
23a90 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65  ageFlags = pPage
23aa0 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
23ab0 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
23ac0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
23ad0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
23ae0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
23af0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
23b00 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pOld[i];.      p
23b10 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
23b20 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
23b30 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
23b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23b50 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
23b60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
23b70 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
23b80 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
23b90 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
23ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23bb0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
23bc0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
23bd0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
23be0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
23bf0 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
23c00 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
23c10 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
23c20 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
23c30 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
23c40 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
23c50 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65    }.    zeroPage
23c60 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
23c70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65  );.  }..  /* Fre
23c80 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
23c90 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
23ca0 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
23cb0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
23cc0 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
23cd0 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
23ce0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
23cf0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
23d00 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
23d10 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
23d20 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
23d30 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
23d40 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
23d50 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
23d60 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
23d70 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
23d80 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
23d90 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
23da0 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
23db0 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
23dc0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
23dd0 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
23de0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
23df0 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
23e00 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
23e10 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
23e20 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
23e30 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
23e40 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
23e50 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
23e60 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
23e70 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
23e80 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
23e90 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
23ea0 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
23eb0 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
23ec0 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
23ed0 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
23ee0 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
23ef0 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
23f00 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
23f10 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
23f20 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
23f30 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
23f40 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
23f50 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
23f60 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
23f70 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
23f80 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
23f90 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
23fa0 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
23fb0 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
23fc0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
23fd0 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
23fe0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
23ff0 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
24000 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
24010 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
24020 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
24030 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
24040 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
24050 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
24060 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
24070 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
24080 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
24090 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
240a0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
240b0 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
240c0 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
240d0 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
240e0 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
240f0 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
24100 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
24110 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
24120 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
24130 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
24140 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
24150 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
24160 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
24170 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
24180 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
24190 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
241a0 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
241b0 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
241c0 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
241d0 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
241e0 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
241f0 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
24200 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
24210 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
24220 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
24230 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
24240 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
24250 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
24260 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
24270 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
24280 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
24290 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
242a0 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
242b0 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
242c0 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
242d0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
242e0 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
242f0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
24300 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
24310 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
24320 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
24330 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
24340 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
24350 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
24360 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
24370 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
24380 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
24390 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
243a0 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
243b0 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61  oNew[i] );.    a
243c0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
243d0 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
243e0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
243f0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
24400 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
24410 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
24420 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
24430 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
24440 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
24450 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
24460 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24470 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
24480 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
24490 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
244a0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
244b0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
244c0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
244d0 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
244e0 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
244f0 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
24500 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
24510 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
24520 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
24530 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
24540 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
24550 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
24560 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
24570 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
24580 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
24590 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
245a0 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
245b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
245c0 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
245d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
245e0 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
245f0 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
24600 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
24610 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
24620 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
24630 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
24640 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
24650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24660 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
24670 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
24680 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24690 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
246a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a   }.#endif..    j
246b0 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
246c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
246d0 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
246e0 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
246f0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
24700 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
24710 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
24720 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
24730 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
24740 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e   */.    if( i<nN
24750 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20  ew-1 && j<nCell 
24760 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
24770 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
24780 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
24790 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
247a0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
247b0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
247c0 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
247d0 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
247e0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
247f0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
24800 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
24810 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
24820 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
24830 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   4);.        pTe
24840 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
24850 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
24860 20 29 7b 0a 09 2f 2a 20 49 66 20 74 68 65 20 74   ){../* If the t
24870 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61  ree is a leaf-da
24880 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  ta tree, and the
24890 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65   siblings are le
248a0 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a  aves, .        *
248b0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
248c0 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  no divider cell 
248d0 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73  in apCell[]. Ins
248e0 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65  tead, the divide
248f0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  r .        ** ce
24900 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ll consists of t
24910 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66  he integer key f
24920 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  or the right-mos
24930 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20  t cell of .     
24940 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e     ** the siblin
24950 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g-page assembled
24960 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20   above only..   
24970 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24980 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
24990 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
249a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
249b0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65  ParseCellPtr(pNe
249c0 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69  w, apCell[j], &i
249d0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43  nfo);.        pC
249e0 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69 53  ell = &aSpace[iS
249f0 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 66  pace];.        f
24a00 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
24a10 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  t, pCell, 0, inf
24a20 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c  o.nKey, 0, 0, 0,
24a30 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69   &sz);.        i
24a40 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
24a50 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
24a60 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
24a70 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
24a80 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
24a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24aa0 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
24ab0 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
24ac0 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
24ad0 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
24ae0 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
24af0 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
24b00 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
24b10 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
24b20 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
24b30 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
24b40 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
24b50 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
24b60 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
24b70 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
24b80 6f 64 65 2c 20 61 6e 64 20 69 74 27 73 20 72 65  ode, and it's re
24b90 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20  ported size was 
24ba0 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  4.        ** byt
24bb0 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  es, then it may 
24bc0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c  actually be smal
24bd0 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20  ler than this . 
24be0 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73         ** (see s
24bf0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
24c00 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74  CellPtr(), 4 byt
24c10 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  es is the minimu
24c20 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20  m size of.      
24c30 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20    ** any cell). 
24c40 42 75 74 20 69 74 27 73 20 69 6d 70 6f 72 74 61  But it's importa
24c50 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
24c60 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
24c70 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
24c80 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
24c90 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
24ca0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
24cb0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
24cc0 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
24cd0 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
24ce0 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
24cf0 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
24d00 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
24d10 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
24d20 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
24d30 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
24d40 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
24d50 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
24d60 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
24d70 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
24d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
24d90 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
24da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
24db0 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
24dc0 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
24dd0 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
24de0 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
24df0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
24e00 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
24e10 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
24e20 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
24e30 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29  l, sz, pTemp, 4)
24e40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
24e50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
24e60 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
24e70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
24e80 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
24e90 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
24ea0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23  , pNew->pgno);.#
24eb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24ec0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24ed0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
24ee0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
24ef0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e   database, and n
24f00 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  ot a leaf-data t
24f10 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ree,.      ** th
24f20 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  en update the po
24f30 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61  inter map with a
24f40 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
24f50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
24f60 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
24f70 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74  cell just insert
24f80 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66  ed points to (if
24f90 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
24fa0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
24fb0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65  utoVacuum && !le
24fc0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
24fd0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
24fe0 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
24ff0 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
25000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
25020 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
25030 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
25040 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25050 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
25060 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
25070 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
25080 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
25090 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
250a0 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
250b0 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
250c0 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
250d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
250e0 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
250f0 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f  a[8], &apCopy[nO
25100 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ld-1]->aData[8],
25110 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   4);.  }.  if( n
25120 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  xDiv==pParent->n
25130 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f  Cell+pParent->nO
25140 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f  verflow ){.    /
25150 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
25160 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68  ling is the righ
25170 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  t-most child of 
25180 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70  pParent */.    p
25190 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
251a0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
251b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
251c0 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
251d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
251e0 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
251f0 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20  ing is the left 
25200 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72  child of the fir
25210 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72  st entry in pPar
25220 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  ent.    ** past 
25230 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64  the right-most d
25240 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a  ivider entry */.
25250 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
25260 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
25270 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70  arent, nxDiv), p
25280 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
25290 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
252a0 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65  Reparent childre
252b0 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a  n of all cells..
252c0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
252d0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
252e0 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
252f0 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b  hildPages(apNew[
25300 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
25310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
25320 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
25330 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65  p;.  }.  rc = re
25340 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
25350 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  (pParent);.  if(
25360 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25370 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
25380 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  eanup;..  /*.  *
25390 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61  * Balance the pa
253a0 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65  rent page.  Note
253b0 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
253c0 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d  t page (pPage) m
253d0 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62  ight.  ** have b
253e0 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  een added to the
253f0 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20   freelist so it 
25400 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  might no longer 
25410 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
25420 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72    ** But the par
25430 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c  ent page will al
25440 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69  ways be initiali
25450 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  zed..  */.  asse
25460 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
25470 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 62 61  nit );.  rc = ba
25480 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30  lance(pParent, 0
25490 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  );.  .  /*.  ** 
254a0 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
254b0 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
254c0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
254d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 70 43    sqliteFree(apC
254e0 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
254f0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
25500 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
25510 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
25520 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
25530 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
25540 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
25550 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
25560 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
25570 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
25580 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25   finished with %
25590 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
255a0 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
255b0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
255c0 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c  gno, nOld, nNew,
255d0 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75   nCell));.  retu
255e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
255f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
25600 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72  called for the r
25610 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74  oot page of a bt
25620 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  ree when the roo
25630 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  t.** page contai
25640 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68  ns no cells.  Th
25650 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75  is is an opportu
25660 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65  nity to make the
25670 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77   tree.** shallow
25680 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e  er by one level.
25690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
256a0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
256b0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
256c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  {.  MemPage *pCh
256d0 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
256e0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69   /* The only chi
256f0 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65  ld page of pPage
25700 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
25710 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
25720 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
25730 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a  r for pChild */.
25740 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25750 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
25760 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
25770 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
25780 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
25790 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
257a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
257b0 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  n BTree structur
257c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c  e */.  int mxCel
257d0 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20  lPerPage;       
257e0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
257f0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70  umber of cells p
25800 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  er page */.  u8 
25810 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
25820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
25830 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65   cells from page
25840 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
25850 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c   */.  int *szCel
25860 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
25870 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
25880 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
25890 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
258a0 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
258b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
258c0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
258d0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
258e0 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
258f0 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
25900 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
25910 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6d 78  iteMallocRaw( mx
25920 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a  CellPerPage*(siz
25930 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28  eof(u8*)+sizeof(
25940 69 6e 74 29 29 20 29 3b 0a 20 20 69 66 28 20 61  int)) );.  if( a
25950 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pCell==0 ) retur
25960 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
25970 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a    szCell = (int*
25980 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50  )&apCell[mxCellP
25990 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70  erPage];.  if( p
259a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
259b0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69    /* The table i
259c0 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
259d0 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28  ty */.    TRACE(
259e0 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79  ("BALANCE: empty
259f0 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50   table %d\n", pP
25a00 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
25a10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
25a20 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
25a30 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20  pty but has one 
25a40 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72  child.  Transfer
25a50 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f   the.    ** info
25a60 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61  rmation from tha
25a70 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f  t one child into
25a80 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
25a90 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  f it .    ** wil
25aa0 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64  l fit.  This red
25ab0 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f  uces the depth o
25ac0 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e  f the tree by on
25ad0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
25ae0 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   If the root pag
25af0 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20  e is page 1, it 
25b00 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61  has less space a
25b10 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20  vailable than.  
25b20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28    ** its child (
25b30 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62  due to the 100 b
25b40 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20  yte header that 
25b50 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65  occurs at the be
25b60 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  ginning.    ** o
25b70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
25b80 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74  le), so it might
25b90 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
25ba0 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  hold all of the 
25bb0 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
25bc0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ion currently co
25bd0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63  ntained in the c
25be0 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69  hild.  If this i
25bf0 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  s the .    ** ca
25c00 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  se, then do not 
25c10 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e  do the transfer.
25c20 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65    Leave page 1 e
25c30 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20  mpty except.    
25c40 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ** for the right
25c50 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  -pointer to the 
25c60 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
25c70 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f   child page beco
25c80 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  mes.    ** the v
25c90 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74  irtual root of t
25ca0 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a  he tree..    */.
25cb0 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20      pgnoChild = 
25cc0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
25cd0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
25ce0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
25cf0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
25d00 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ld>0 );.    asse
25d10 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73  rt( pgnoChild<=s
25d20 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
25d30 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d  ount(pPage->pBt-
25d40 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  >pPager) );.    
25d50 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25d60 65 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e  eGetPage(pPage->
25d70 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
25d80 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20  &pChild, 0);.   
25d90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
25da0 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
25db0 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ce;.    if( pPag
25dc0 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  e->pgno==1 ){.  
25dd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25de0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43  BtreeInitPage(pC
25df0 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20  hild, pPage);.  
25e00 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
25e10 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
25e20 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73  lance;.      ass
25e30 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  ert( pChild->nOv
25e40 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20  erflow==0 );.   
25e50 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
25e60 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20  Free>=100 ){.   
25e70 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
25e80 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
25e90 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
25ea0 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74  ot page, so do t
25eb0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  he.        ** co
25ec0 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  py */.        in
25ed0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72  t i;.        zer
25ee0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
25ef0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  ild->aData[0]);.
25f00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
25f10 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
25f20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
25f30 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69    apCell[i] = fi
25f40 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29  ndCell(pChild,i)
25f50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  ;.          szCe
25f60 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ll[i] = cellSize
25f70 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65  Ptr(pChild, apCe
25f80 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ll[i]);.        
25f90 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62  }.        assemb
25fa0 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  lePage(pPage, pC
25fb0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43  hild->nCell, apC
25fc0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20  ell, szCell);.  
25fd0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
25fe0 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
25ff0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20  of the child to 
26000 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  the parent. */. 
26010 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
26020 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
26030 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
26040 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
26050 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64  get4byte(&pChild
26060 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e  ->aData[pChild->
26070 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
26080 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65          freePage
26090 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
260a0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
260b0 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e  E: child %d tran
260c0 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e  sfer to page 1\n
260d0 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
260e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
260f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
26100 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e  hild has more in
26110 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
26120 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
26130 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  oot..        ** 
26140 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65  The tree is alre
26150 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44  ady balanced.  D
26160 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20  o nothing. */.  
26170 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
26180 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
26190 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
261a0 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
261b0 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
261c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
261d0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
261e0 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d  ->aData, pChild-
261f0 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70  >aData, pPage->p
26200 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
26210 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73  .      pPage->is
26220 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Init = 0;.      
26230 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
26240 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
26250 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
26260 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  age(pPage, 0);. 
26270 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
26280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
26290 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68      freePage(pCh
262a0 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43  ild);.      TRAC
262b0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61  E(("BALANCE: tra
262c0 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69  nsfer child %d i
262d0 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a  nto root %d\n",.
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
262f0 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67  hild->pgno, pPag
26300 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  e->pgno));.    }
26310 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
26320 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61  ntChildPages(pPa
26330 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge);.    assert(
26340 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
26350 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  w==0 );.#ifndef 
26360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26370 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
26380 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
26390 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
263a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
263b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
263c0 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20  +){ .        rc 
263d0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
263e0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
263f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26410 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c    goto end_shall
26420 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
26430 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26440 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
26450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26460 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
26470 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
26480 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
26490 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68  ild);.  }.end_sh
264a0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20  allow_balance:. 
264b0 20 73 71 6c 69 74 65 46 72 65 65 28 61 70 43 65   sqliteFree(apCe
264c0 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
264d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
264e0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65  root page is ove
264f0 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rfull.**.** When
26500 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43   this happens, C
26510 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c  reate a new chil
26520 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20  d page and copy 
26530 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
26540 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f  of the root into
26550 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65   the child.  The
26560 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a  n make the root.
26570 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79  ** page an empty
26580 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74   page with right
26590 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74  Child pointing t
265a0 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69  o the new.** chi
265b0 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63  ld.   Finally, c
265c0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65  all balance_inte
265d0 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65  rnal() on the ne
265e0 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61  w child.** to ca
265f0 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e  use it to split.
26600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
26610 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65  alance_deeper(Me
26620 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
26630 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
26640 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
26650 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
26660 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
26670 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
26680 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
26690 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
266a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
266b0 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ild;     /* Page
266c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
266d0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
266e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
266f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
26700 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   BTree */.  int 
26710 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
26720 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20  /* Total usable 
26730 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a  size of a page *
26740 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
26750 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
26760 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  nt of the parent
26770 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63   page */.  u8 *c
26780 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
26790 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
267a0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
267b0 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
267c0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
267d0 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e  o page header in
267e0 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74   parent */.  int
267f0 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20   brk;           
26800 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f   /* Offset to co
26810 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63  ntent of first c
26820 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f  ell in parent */
26830 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
26840 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
26850 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26860 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
26870 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
26880 70 42 74 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  pBt;.  rc = allo
26890 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
268a0 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e  t, &pChild, &pgn
268b0 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70  oChild, pPage->p
268c0 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gno, 0);.  if( r
268d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
268e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
268f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
26900 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
26910 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
26920 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
26930 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ize;.  data = pP
26940 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
26950 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
26960 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65  fset;.  brk = ge
26970 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
26980 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20  +5]);.  cdata = 
26990 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20  pChild->aData;. 
269a0 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26   memcpy(cdata, &
269b0 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65  data[hdr], pPage
269c0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
269d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29  Page->nCell-hdr)
269e0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74  ;.  memcpy(&cdat
269f0 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72  a[brk], &data[br
26a00 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62  k], usableSize-b
26a10 72 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rk);.  assert( p
26a20 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30  Child->isInit==0
26a30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
26a40 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
26a50 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a  pChild, pPage);.
26a60 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26a70 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
26a80 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  t;.  memcpy(pChi
26a90 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
26aa0 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
26ab0 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
26ac0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
26ad0 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
26ae0 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d  verflow = pPage-
26af0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66  >nOverflow;.  if
26b00 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
26b10 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c  low ){.    pChil
26b20 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  d->nFree = 0;.  
26b30 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  }.  assert( pChi
26b40 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65  ld->nCell==pPage
26b50 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72  ->nCell );.  zer
26b60 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
26b70 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
26b80 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75  ~PTF_LEAF);.  pu
26b90 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
26ba0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
26bb0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
26bc0 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ild);.  TRACE(("
26bd0 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
26be0 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
26bf0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
26c00 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23  Child->pgno));.#
26c10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26c20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
26c30 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26c40 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uum ){.    int i
26c50 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
26c60 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64  pPut(pBt, pChild
26c70 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
26c80 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e  TREE, pPage->pgn
26c90 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
26ca0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
26cb0 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72  per_out;.    for
26cc0 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
26cd0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
26ce0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
26cf0 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29  tOvfl(pChild, i)
26d00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
26d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26d20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26d40 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20  }.#endif.  rc = 
26d50 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
26d60 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63  pChild);..balanc
26d70 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72  edeeper_out:.  r
26d80 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
26d90 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
26da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65  .}../*.** Decide
26db0 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61   if the page pPa
26dc0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ge needs to be b
26dd0 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c  alanced.  If bal
26de0 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71  ancing is.** req
26df0 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20  uired, call the 
26e00 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
26e10 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a  ncing routine..*
26e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
26e30 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  ance(MemPage *pP
26e40 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29  age, int insert)
26e50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26e60 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
26e70 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
26e80 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
26e90 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
26ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
26eb0 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
26ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
26ed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26ee0 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  & pPage->nCell==
26ef0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
26f00 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
26f10 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
26f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
26f30 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
26f40 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
26f50 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67  (!insert && pPag
26f60 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
26f70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
26f80 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
26f90 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
26fa0 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ot(pPage);.    }
26fb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
26fd0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61  routine checks a
26fe0 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ll cursors that 
26ff0 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70  point to table p
27000 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61  gnoRoot..** If a
27010 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73  ny of those curs
27020 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20  ors were opened 
27030 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69  with wrFlag==0 i
27040 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  n a different.**
27050 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
27060 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65  tion (a database
27070 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
27080 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65   shares the page
27090 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20  r.** cache with 
270a0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e  the current conn
270b0 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74  ection) and that
270c0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
270d0 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20  n .** is not in 
270e0 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69  the ReadUncommmi
270f0 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e  tted state, then
27100 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
27110 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
27120 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49  _LOCKED..**.** I
27130 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 63 68  n addition to ch
27140 65 63 6b 69 6e 67 20 66 6f 72 20 72 65 61 64 2d  ecking for read-
27150 6c 6f 63 6b 73 20 28 77 68 65 72 65 20 61 20 72  locks (where a r
27160 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61  ead-lock .** mea
27170 6e 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  ns a cursor open
27180 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
27190 30 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0) this routine 
271a0 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c  also moves.** al
271b0 6c 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  l write cursors 
271c0 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
271d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
271e0 20 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c 6c 20   .** first Cell 
271f0 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  on the root page
27200 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
27210 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6e 20  sary because an 
27220 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65  insert .** or de
27230 6c 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67  lete might chang
27240 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
27250 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20  cells on a page 
27260 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70  or delete.** a p
27270 61 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64  age entirely and
27280 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
27290 74 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72  to leave any cur
272a0 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  sors .** pointin
272b0 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e  g to non-existan
272c0 74 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73  t pages or cells
272d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
272e0 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42  checkReadLocks(B
272f0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67  tree *pBtree, Pg
27300 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74 43  no pgnoRoot, BtC
27310 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 29  ursor *pExclude)
27320 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
27330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
27340 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
27350 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
27360 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b  pBtree->pSqlite;
27370 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
27380 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
27390 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
273a0 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e  ==pExclude ) con
273b0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
273c0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
273d0 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75  _VALID ) continu
273e0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  e;.    if( p->pg
273f0 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74  noRoot!=pgnoRoot
27400 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27410 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d   if( p->wrFlag==
27420 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27430 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d  e3 *dbOther = p-
27440 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65  >pBtree->pSqlite
27450 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74  ;.      if( dbOt
27460 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  her==0 ||.      
27470 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20     (dbOther!=db 
27480 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61  && (dbOther->fla
27490 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64  gs & SQLITE_Read
274a0 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29  Uncommitted)==0)
274b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
274c0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
274d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
274e0 6c 73 65 20 69 66 28 20 70 2d 3e 70 50 61 67 65  lse if( p->pPage
274f0 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52  ->pgno!=p->pgnoR
27500 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76  oot ){.      mov
27510 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20  eToRoot(p);.    
27520 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
27530 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27540 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
27550 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
27560 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20  BTree.  The key 
27570 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65  is given by (pKe
27580 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74  y,nKey).** and t
27590 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e  he data is given
275a0 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61   by (pData,nData
275b0 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69  ).  The cursor i
275c0 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a  s used only to.*
275d0 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61  * define what ta
275e0 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73  ble the record s
275f0 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
27600 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72  d into.  The cur
27610 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
27620 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
27630 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  dom location..**
27640 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45  .** For an INTKE
27650 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68  Y table, only th
27660 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20  e nKey value of 
27670 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
27680 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
27690 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52  ored.  For a ZER
276a0 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65  ODATA table, the
276b0 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61   pData and nData
276c0 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65   are both ignore
276d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
276e0 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
276f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27710 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
27720 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
27730 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
27740 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
27750 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
27760 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
27770 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
27780 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
27790 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
277a0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
277b0 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
277c0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
277f0 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
27800 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
27810 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
27820 69 61 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ias             
27830 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
27840 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
27850 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20   append */.){.  
27860 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f  int rc;.  int lo
27870 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a  c;.  int szNew;.
27880 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27890 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
278a0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
278b0 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
278c0 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
278d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
278e0 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
278f0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
27900 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
27910 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
27920 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
27930 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
27940 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20  doing an insert 
27950 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
27960 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
27970 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
27980 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27990 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
279a0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
279b0 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
279c0 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
279d0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
279e0 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65  * Cursor not ope
279f0 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  n for writing */
27a00 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
27a10 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e  ReadLocks(pCur->
27a20 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
27a30 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b  noRoot, pCur) ){
27a40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27a50 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
27a60 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
27a70 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
27a80 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20  d lock */.  }.. 
27a90 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
27aa0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
27ab0 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
27ac0 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a   on this table *
27ad0 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50  /.  clearCursorP
27ae0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
27af0 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45   if( .    SQLITE
27b00 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
27b10 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
27b20 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
27b30 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c  Cur)) ||.    SQL
27b40 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
27b50 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
27b60 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65  (pCur, pKey, nKe
27b70 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26  y, appendBias, &
27b80 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  loc)).  ){.    r
27b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
27ba0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
27bb0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
27bc0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
27bd0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
27be0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
27bf0 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61  f || !pPage->lea
27c00 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43 45  fData );.  TRACE
27c10 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
27c20 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
27c30 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
27c40 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
27c50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
27c60 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
27c70 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
27c80 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
27c90 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
27ca0 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
27cb0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
27cc0 74 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  t );.  rc = sqli
27cd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
27ce0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
27cf0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
27d00 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d   rc;.  newCell =
27d10 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
27d20 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
27d30 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77  Bt) );.  if( new
27d40 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
27d50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27d60 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
27d70 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c  (pPage, newCell,
27d80 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61   pKey, nKey, pDa
27d90 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f  ta, nData, nZero
27da0 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28  , &szNew);.  if(
27db0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
27dc0 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  nsert;.  assert(
27dd0 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65   szNew==cellSize
27de0 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65  Ptr(pPage, newCe
27df0 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
27e00 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f   szNew<=MX_CELL_
27e10 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
27e20 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52  f( loc==0 && CUR
27e30 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
27e40 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 69  >eState ){.    i
27e50 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73  nt szOld;.    as
27e60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
27e70 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
27e80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
27e90 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69      oldCell = fi
27ea0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
27eb0 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66  ur->idx);.    if
27ec0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
27ed0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e  {.      memcpy(n
27ee0 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c  ewCell, oldCell,
27ef0 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   4);.    }.    s
27f00 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50  zOld = cellSizeP
27f10 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  tr(pPage, oldCel
27f20 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  l);.    rc = cle
27f30 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c  arCell(pPage, ol
27f40 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  dCell);.    if( 
27f50 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
27f60 73 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65  sert;.    dropCe
27f70 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
27f80 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d  idx, szOld);.  }
27f90 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26  else if( loc<0 &
27fa0 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  & pPage->nCell>0
27fb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27fc0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
27fd0 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a     pCur->idx++;.
27fe0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
27ff0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Size = 0;.  }els
28000 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
28010 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
28020 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43  }.  rc = insertC
28030 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
28040 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73  >idx, newCell, s
28050 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69  zNew, 0, 0);.  i
28060 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28070 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
28080 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e  rt;.  rc = balan
28090 63 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  ce(pPage, 1);.  
280a0 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  /* sqlite3BtreeP
280b0 61 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70 42  ageDump(pCur->pB
280c0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
280d0 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66  t, 1); */.  /* f
280e0 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a  flush(stdout); *
280f0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
28100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
28110 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
28120 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20   }.end_insert:. 
28130 20 73 71 6c 69 74 65 46 72 65 65 28 6e 65 77 43   sqliteFree(newC
28140 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ell);.  return r
28150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
28160 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
28170 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
28180 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
28190 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
281a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
281b0 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
281c0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
281d0 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43  3BtreeDelete(BtC
281e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
281f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
28200 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
28210 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
28220 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cell;.  int rc;.
28230 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
28240 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
28250 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
28260 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  tree->pBt;..  as
28270 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
28280 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74  nit );.  if( pBt
28290 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
282a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
282b0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
282c0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
282d0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64  before doing a d
282e0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74  elete */.    ret
282f0 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
28300 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
28310 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
28320 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OR;.  }.  assert
28330 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
28340 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
28350 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43  idx >= pPage->nC
28360 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ell ){.    retur
28370 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  n SQLITE_ERROR; 
28380 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69   /* The cursor i
28390 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
283a0 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  o anything */.  
283b0 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77  }.  if( !pCur->w
283c0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rFlag ){.    ret
283d0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
283e0 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70     /* Did not op
283f0 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66  en this cursor f
28400 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
28410 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
28420 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
28430 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
28440 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20  oot, pCur) ){.  
28450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28460 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
28470 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
28480 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
28490 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ock */.  }..  /*
284a0 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
284b0 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
284c0 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66  tion (a no-op if
284d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
284e0 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53  ot in .  ** CURS
284f0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73  OR_REQUIRESEEK s
28500 74 61 74 65 29 20 61 6e 64 20 73 61 76 65 20 74  tate) and save t
28510 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
28520 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
28530 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20  s .  ** open on 
28540 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
28550 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65  Then call sqlite
28560 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
28570 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74   the page.  ** t
28580 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 77 69  hat the entry wi
28590 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66 72  ll be deleted fr
285a0 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  om..  */.  if( .
285b0 20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72      (rc = restor
285c0 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
285d0 73 69 74 69 6f 6e 28 70 43 75 72 29 29 21 3d 30  sition(pCur))!=0
285e0 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61   ||.    (rc = sa
285f0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
28600 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
28610 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  , pCur))!=0 ||. 
28620 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33     (rc = sqlite3
28630 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
28640 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a 20  ->pDbPage))!=0. 
28650 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
28660 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  c;.  }..  /* Loc
28670 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74  ate the cell wit
28680 68 69 6e 20 69 74 27 73 20 70 61 67 65 20 61 6e  hin it's page an
28690 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f  d leave pCell po
286a0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20  inting to the.  
286b0 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65  ** data. The cle
286c0 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72  arCell() call fr
286d0 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ees any overflow
286e0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
286f0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
28700 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69  cell. The cell i
28710 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69  tself is still i
28720 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43  ntact..  */.  pC
28730 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
28740 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
28750 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
28760 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
28770 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
28780 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  (pCell);.  }.  r
28790 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
287a0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69  age, pCell);.  i
287b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
287c0 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
287d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
287e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72  .    ** The entr
287f0 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  y we are about t
28800 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20  o delete is not 
28810 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20  a leaf so if we 
28820 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f  do not.    ** do
28830 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69   something we wi
28840 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20  ll leave a hole 
28850 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70  on an internal p
28860 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68  age..    ** We h
28870 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ave to fill the 
28880 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69  hole by moving i
28890 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  n a cell from a 
288a0 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a  leaf.  The.    *
288b0 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65  * next Cell afte
288c0 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20  r the one to be 
288d0 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61  deleted is guara
288e0 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61  nteed to exist a
288f0 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  nd.    ** to be 
28900 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e  a leaf so we can
28910 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a   use it..    */.
28920 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61      BtCursor lea
28930 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e  fCur;.    unsign
28940 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a  ed char *pNext;.
28950 20 20 20 20 69 6e 74 20 73 7a 4e 65 78 74 3b 20      int szNext; 
28960 20 2f 2a 20 54 68 65 20 63 6f 6d 70 69 6c 65 72   /* The compiler
28970 20 77 61 72 6e 69 6e 67 20 69 73 20 77 72 6f 6e   warning is wron
28980 67 3a 20 73 7a 4e 65 78 74 20 69 73 20 61 6c 77  g: szNext is alw
28990 61 79 73 20 0a 20 20 20 20 20 20 20 20 20 20 20  ays .           
289a0 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
289b0 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e  ized before use.
289c0 20 20 41 64 64 69 6e 67 20 61 6e 20 65 78 74 72    Adding an extr
289d0 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  a initialization
289e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
289f0 20 20 2a 2a 20 74 6f 20 73 69 6c 65 6e 63 65 20    ** to silence 
28a00 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 73 6c 6f  the compiler slo
28a10 77 73 20 64 6f 77 6e 20 74 68 65 20 63 6f 64 65  ws down the code
28a20 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f 74  . */.    int not
28a30 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
28a40 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
28a50 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
28a60 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44  t( !pPage->leafD
28a70 61 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ata );.    sqlit
28a80 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
28a90 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
28aa0 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
28ab0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
28ac0 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
28ad0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
28ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28af0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28b00 50 61 67 65 72 57 72 69 74 65 28 6c 65 61 66 43  PagerWrite(leafC
28b10 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ur.pPage->pDbPag
28b20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
28b30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28b40 29 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  ){.      TRACE((
28b50 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
28b60 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
28b70 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
28b80 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
28b90 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
28ba0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
28bb0 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72  e->pgno, leafCur
28bc0 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a  .pPage->pgno));.
28bd0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
28be0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
28bf0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
28c00 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
28c10 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
28c20 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
28c30 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b  e, leafCur.idx);
28c40 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20  .      szNext = 
28c50 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66  cellSizePtr(leaf
28c60 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74  Cur.pPage, pNext
28c70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28c80 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
28c90 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a  t)>=szNext+4 );.
28ca0 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d        tempCell =
28cb0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
28cc0 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
28cd0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Bt) );.      if(
28ce0 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a   tempCell==0 ){.
28cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28d00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
28d10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
28d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28d30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  {.      rc = ins
28d40 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
28d50 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d  Cur->idx, pNext-
28d60 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
28d70 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pCell, 0);.    }
28d80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28da0 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
28db0 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
28dc0 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e   pCur->idx), pgn
28dd0 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72  oChild);.      r
28de0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
28df0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
28e00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28e10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70  OK ){.      drop
28e20 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61  Cell(leafCur.pPa
28e30 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c  ge, leafCur.idx,
28e40 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   szNext);.      
28e50 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61  rc = balance(lea
28e60 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a  fCur.pPage, 0);.
28e70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28e80 46 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a  Free(tempCell);.
28e90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
28ea0 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  ReleaseTempCurso
28eb0 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d  r(&leafCur);.  }
28ec0 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28  else{.    TRACE(
28ed0 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
28ee0 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c  %d delete from l
28ef0 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
28f00 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
28f10 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
28f20 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
28f30 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
28f40 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
28f50 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
28f60 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
28f70 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ge, 0);.  }.  if
28f80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28f90 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
28fa0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72  t(pCur);.  }.  r
28fb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28fc0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
28fd0 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72  BTree table.  Wr
28fe0 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c  ite into *piTabl
28ff0 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  e the page.** nu
29000 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f  mber for the roo
29010 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
29020 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  w table..**.** T
29030 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20  he type of type 
29040 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
29050 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
29060 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  eter.  Only the.
29070 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  ** following val
29080 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65  ues of flags are
29090 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
290a0 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73  e.  Other values
290b0 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69   for.** flags mi
290c0 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a  ght not work:.**
290d0 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e  .**     BTREE_IN
290e0 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44  TKEY|BTREE_LEAFD
290f0 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72  ATA     Used for
29100 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68   SQL tables with
29110 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20   rowid keys.**  
29120 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54     BTREE_ZERODAT
29130 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A               
29140 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
29150 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74 20 73  indices.*/.int s
29160 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
29170 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
29180 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
29190 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53  nt flags){.  BtS
291a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
291b0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
291c0 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67  pRoot;.  Pgno pg
291d0 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  noRoot;.  int rc
291e0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
291f0 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
29200 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
29210 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
29220 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74  ransaction first
29230 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
29240 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
29250 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
29260 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29270 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
29280 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
29290 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
292a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
292b0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
292c0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
292d0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
292e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
292f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73   return rc;.#els
29300 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  e.  if( pBt->aut
29310 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
29320 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20  gno pgnoMove;   
29330 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67     /* Move a pag
29340 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72  e here to make r
29350 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  oom for the root
29360 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  -page */.    Mem
29370 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b  Page *pPageMove;
29380 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
29390 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20  move to. */..   
293a0 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e   /* Creating a n
293b0 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f  ew table may pro
293c0 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f  bably require mo
293d0 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  ving an existing
293e0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
293f0 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
29400 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  r the new tables
29410 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63   root page. In c
29420 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75  ase this page tu
29430 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  rns.    ** out t
29440 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  o be an overflow
29450 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c   page, delete al
29460 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  l overflow page-
29470 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a  map caches.    *
29480 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63  * held by open c
29490 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  ursors..    */. 
294a0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
294b0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
294c0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  t);..    /* Read
294d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
294e0 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64  ta[3] from the d
294f0 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72  atabase to deter
29500 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20  mine where the. 
29510 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
29520 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
29530 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61   should go. meta
29540 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65  [3] is the large
29550 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
29560 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66   ** created so f
29570 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72  ar, so the new r
29580 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74  oot-page is (met
29590 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a  a[3]+1)..    */.
295a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
295b0 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
295c0 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  4, &pgnoRoot);. 
295d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
295e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
295f0 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b  ;.    pgnoRoot++
29600 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
29610 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20  w root-page may 
29620 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
29630 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   on a pointer-ma
29640 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20  p page, or the. 
29650 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
29660 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  TE page..    */.
29670 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74      if( pgnoRoot
29680 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
29690 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c  pBt, pgnoRoot) |
296a0 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f  |.        pgnoRo
296b0 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ot==PENDING_BYTE
296c0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
296d0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
296e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
296f0 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b  ( pgnoRoot>=3 );
29700 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
29710 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61  e a page. The pa
29720 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  ge that currentl
29730 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e  y resides at pgn
29740 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a  oRoot will.    *
29750 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  * be moved to th
29760 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
29770 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c   (unless the all
29780 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70  ocated page happ
29790 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65  ens.    ** to re
297a0 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  side at pgnoRoot
297b0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
297c0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
297d0 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65  Page(pBt, &pPage
297e0 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c  Move, &pgnoMove,
297f0 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20   pgnoRoot, 1);. 
29800 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29810 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
29820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
29830 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65      if( pgnoMove
29840 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  !=pgnoRoot ){.  
29850 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20      /* pgnoRoot 
29860 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
29870 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
29880 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
29890 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
298a0 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d  new table (assum
298b0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64  ing an error did
298c0 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74   not occur). But
298d0 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a   we were.      *
298e0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f  * allocated pgno
298f0 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65  Move. If require
29900 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61  d (i.e. if it wa
29910 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a  s not allocated.
29920 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65        ** by exte
29930 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c  nding the file),
29940 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
29950 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67  e at position pg
29960 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20  noMove.      ** 
29970 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e  is already journ
29980 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  aled..      */. 
29990 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
299a0 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
299b0 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
299c0 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
299d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76  );..      /* Mov
299e0 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  e the page curre
299f0 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ntly at pgnoRoot
29a00 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f   to pgnoMove. */
29a10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29a20 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
29a30 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
29a40 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
29a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29a60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
29a70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
29a80 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
29a90 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52  apGet(pBt, pgnoR
29aa0 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50  oot, &eType, &iP
29ab0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  trPage);.      i
29ac0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29ad0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
29ae0 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
29af0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
29b00 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
29b10 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
29b20 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
29b30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29b40 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
29b50 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
29b60 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AGE );.      ass
29b70 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
29b80 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20  AP_FREEPAGE );. 
29b90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29ba0 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
29bb0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
29bc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29be0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
29bf0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
29c00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29c10 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
29c20 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f  tePage(pBt, pRoo
29c30 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  t, eType, iPtrPa
29c40 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20  ge, pgnoMove);. 
29c50 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
29c60 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20  (pRoot);..      
29c70 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61  /* Obtain the pa
29c80 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a  ge at pgnoRoot *
29c90 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  /.      if( rc!=
29ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29cb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
29cd0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
29ce0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
29cf0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
29d00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29d20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
29d40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29d50 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
29d60 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
29d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29d80 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
29d90 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
29da0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29dc0 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  e{.      pRoot =
29dd0 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20   pPageMove;.    
29de0 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  } ..    /* Updat
29df0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  e the pointer-ma
29e00 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20  p and meta-data 
29e10 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f  with the new roo
29e20 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a  t-page number. *
29e30 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  /.    rc = ptrma
29e40 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pPut(pBt, pgnoRo
29e50 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ot, PTRMAP_ROOTP
29e60 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
29e70 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
29e80 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
29e90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
29eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
29ec0 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67  ateMeta(p, 4, pg
29ed0 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
29ee0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
29ef0 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
29f00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29f10 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
29f20 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  {.    rc = alloc
29f30 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
29f40 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
29f50 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  oot, 1, 0);.    
29f60 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
29f70 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rc;.  }.#endif. 
29f80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29f90 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29fa0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
29fb0 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
29fc0 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54  Root, flags | PT
29fd0 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74  F_LEAF);.  sqlit
29fe0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f  e3PagerUnref(pRo
29ff0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
2a000 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29  *piTable = (int)
2a010 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75  pgnoRoot;.  retu
2a020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a030 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65  ./*.** Erase the
2a040 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
2a050 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73  page and all its
2a060 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75   children.  Retu
2a070 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74  rn.** the page t
2a080 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
2a090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2a0a0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2a0b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a0c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2a0d0 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f  he BTree that co
2a0e0 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
2a0f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
2a100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a110 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c  age number to cl
2a120 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ear */.  MemPage
2a130 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f   *pParent,     /
2a140 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20  * Parent page.  
2a150 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f  NULL for the roo
2a160 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50  t */.  int freeP
2a170 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20  ageFlag      /* 
2a180 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20  Deallocate page 
2a190 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
2a1a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2a1b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
2a1c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2a1d0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Cell;.  int i;..
2a1e0 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74    if( pgno>sqlit
2a1f0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2a200 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
2a210 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a220 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2a230 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
2a240 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2a250 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70   pgno, &pPage, p
2a260 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
2a270 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2a280 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2a290 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2a2a0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
2a2b0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2a2c0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
2a2d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2a2e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2a2f0 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2a300 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2a310 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67  yte(pCell), pPag
2a320 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2a330 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2a340 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2a350 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2a360 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
2a370 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2a380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2a390 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2a3a0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  sepage_out;.  }.
2a3b0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2a3c0 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  af ){.    rc = c
2a3d0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2a3e0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
2a3f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29  pPage->aData[8])
2a400 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
2a410 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
2a420 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2a430 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2a440 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67   }.  if( freePag
2a450 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  eFlag ){.    rc 
2a460 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2a470 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
2a480 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a490 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2a4a0 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20  bPage))==0 ){.  
2a4b0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2a4c0 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
2a4d0 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ] | PTF_LEAF);. 
2a4e0 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73   }..cleardatabas
2a4f0 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c  epage_out:.  rel
2a500 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2a510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a520 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
2a530 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  l information fr
2a540 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  om a single tabl
2a550 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2a560 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a  e.  iTable is.**
2a570 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2a580 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   of the root of 
2a590 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65  the table.  Afte
2a5a0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
2a5b0 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72  eturns,.** the r
2a5c0 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
2a5d0 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69  y, but still exi
2a5e0 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sts..**.** This 
2a5f0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
2a600 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
2a610 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
2a620 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65  e any open.** re
2a630 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ad cursors on th
2a640 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77  e table.  Open w
2a650 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
2a660 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
2a670 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2a680 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
2a690 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
2a6a0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2a6b0 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72  iTable){.  int r
2a6c0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
2a6d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
2a6e0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
2a6f0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2a700 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2a710 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2a720 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2a730 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
2a740 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  c = checkReadLoc
2a750 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29  ks(p, iTable, 0)
2a760 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2a770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2a780 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2a790 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  position of all 
2a7a0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2a7b0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
2a7c0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
2a7d0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2a7e0 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c  ors(pBt, iTable,
2a7f0 20 30 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75   0)) ){.    retu
2a800 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65  rn rc;.  }..  re
2a810 74 75 72 6e 20 63 6c 65 61 72 44 61 74 61 62 61  turn clearDataba
2a820 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  sePage(pBt, (Pgn
2a830 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b  o)iTable, 0, 0);
2a840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2a850 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2a860 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61  in a table and a
2a870 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  dd the root of t
2a880 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74  he table to.** t
2a890 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78  he freelist.  Ex
2a8a0 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f  cept, the root o
2a8b0 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20  f the principle 
2a8c0 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f  table (the one o
2a8d0 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20  n.** page 1) is 
2a8e0 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 74  never added to t
2a8f0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
2a900 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a910 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
2a920 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
2a930 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
2a940 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e  en.** cursors on
2a950 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2a960 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20  * If AUTOVACUUM 
2a970 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74  is enabled and t
2a980 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c  he page at iTabl
2a990 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  e is not the las
2a9a0 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69  t.** root page i
2a9b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a9c0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  ile, then the la
2a9d0 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a  st root page .**
2a9e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2a9f0 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69   file is moved i
2aa00 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72  nto the slot for
2aa10 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
2aa20 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20  y.** iTable and 
2aa30 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66  that last slot f
2aa40 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
2aa50 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   by the last roo
2aa60 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64  t page.** is add
2aa70 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
2aa80 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54  st instead of iT
2aa90 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73  able.  In this s
2aaa0 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20  ay, all.** root 
2aab0 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20 61  pages are kept a
2aac0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2aad0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2aae0 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69  file, which.** i
2aaf0 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
2ab00 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f  AUTOVACUUM to wo
2ab10 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f  rk right.  *piMo
2ab20 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  ved is set to th
2ab30 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  e .** page numbe
2ab40 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 62  r that used to b
2ab50 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  e the last root 
2ab60 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
2ab70 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d   before.** the m
2ab80 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65  ove.  If no page
2ab90 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69   gets moved, *pi
2aba0 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
2abb0 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72  0..** The last r
2abc0 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63 6f  oot page is reco
2abd0 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20  rded in meta[3] 
2abe0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
2abf0 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75  .** meta[3] is u
2ac00 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20 70  pdated by this p
2ac10 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74  rocedure..*/.int
2ac20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
2ac30 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  pTable(Btree *p,
2ac40 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
2ac50 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e   *piMoved){.  in
2ac60 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2ac70 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74  *pPage = 0;.  Bt
2ac80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2ac90 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  >pBt;..  if( p->
2aca0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2acb0 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
2acc0 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2acd0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2ace0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2acf0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20  R;.  }..  /* It 
2ad00 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72  is illegal to dr
2ad10 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e  op a table if an
2ad20 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70  y cursors are op
2ad30 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  en on the.  ** d
2ad40 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
2ad50 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f   because in auto
2ad60 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65  -vacuum mode the
2ad70 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a   backend may.  *
2ad80 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61  * need to move a
2ad90 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65  nother root-page
2ada0 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c   to fill a gap l
2adb0 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74  eft by the delet
2adc0 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  ed.  ** root pag
2add0 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75  e. If an open cu
2ade0 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74  rsor was using t
2adf0 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c  his page a probl
2ae00 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f  em would .  ** o
2ae10 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ccur..  */.  if(
2ae20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pBt->pCursor ){
2ae30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ae40 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a  TE_LOCKED;.  }..
2ae50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2ae60 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ae70 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
2ae80 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
2ae90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2aea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2aeb0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c  reeClearTable(p,
2aec0 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20   iTable);.  if( 
2aed0 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  rc ){.    releas
2aee0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2aef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2af00 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30  ..  *piMoved = 0
2af10 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e  ;..  if( iTable>
2af20 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  1 ){.#ifdef SQLI
2af30 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2af40 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  UM.    rc = free
2af50 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2af60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2af70 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ge);.#else.    i
2af80 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2af90 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  um ){.      Pgno
2afa0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
2afb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2afc0 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
2afd0 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  4, &maxRootPgno)
2afe0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2aff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b000 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2b010 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2b020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b030 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
2b040 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67  Table==maxRootPg
2b050 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  no ){.        /*
2b060 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   If the table be
2b070 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74  ing dropped is t
2b080 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
2b090 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
2b0a0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
2b0b0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
2b0c0 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72  abase, put the r
2b0d0 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20  oot page on the 
2b0e0 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20  free list. .    
2b0f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
2b100 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2b110 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
2b120 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2b130 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2b140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b150 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2b160 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2b170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b180 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
2b190 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65  eing dropped doe
2b1a0 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c  s not have the l
2b1b0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2b1c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
2b1d0 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2b1e0 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20  se. So move the 
2b1f0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69  page that does i
2b200 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20  nto the .       
2b210 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20   ** gap left by 
2b220 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74  the deleted root
2b230 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a  -page..        *
2b240 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  /.        MemPag
2b250 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20  e *pMove;.      
2b260 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2b270 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  age);.        rc
2b280 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2b290 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
2b2a0 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c  ootPgno, &pMove,
2b2b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2b2c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b2d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2b2e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2b2f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
2b300 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
2b310 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f  pMove, PTRMAP_RO
2b320 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c  OTPAGE, 0, iTabl
2b330 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
2b340 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
2b350 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2b360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b370 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2b380 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b3a0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
2b3b0 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
2b3c0 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  pMove, 0);.     
2b3d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b3e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b3f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2b410 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f  c = freePage(pMo
2b420 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ve);.        rel
2b430 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
2b440 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2b450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b460 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2b470 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2b480 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20       *piMoved = 
2b490 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
2b4a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
2b4b0 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d  et the new 'max-
2b4c0 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65  root-page' value
2b4d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2b4e0 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20   header. This.  
2b4f0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c      ** is the ol
2b500 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65  d value less one
2b510 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20  , less one more 
2b520 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20  if that happens 
2b530 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61  to.      ** be a
2b540 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
2b550 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69  r, less one agai
2b560 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65  n if that is the
2b570 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  .      ** PENDIN
2b580 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20  G_BYTE_PAGE..   
2b590 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52     */.      maxR
2b5a0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2b5b0 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f   if( maxRootPgno
2b5c0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2b5d0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2b5e0 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
2b5f0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
2b600 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f   if( maxRootPgno
2b610 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
2b620 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
2b630 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
2b640 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
2b650 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2b660 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50  ( maxRootPgno!=P
2b670 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2b680 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20  (pBt) );..      
2b690 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2b6a0 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
2b6b0 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a  , maxRootPgno);.
2b6c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b6d0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2b6e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c  Page);.      rel
2b6f0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2b700 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2b710 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2b720 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
2b730 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65  pTable was calle
2b740 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  d on page 1. */.
2b750 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2b760 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ge, PTF_INTKEY|P
2b770 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72  TF_LEAF );.    r
2b780 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2b790 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b7a0 72 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rc;  .}.../*.** 
2b7b0 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
2b7c0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
2b7d0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2b7e0 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
2b7f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
2b800 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
2b810 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
2b820 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
2b830 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
2b840 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
2b850 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
2b860 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
2b870 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
2b880 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
2b890 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
2b8a0 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
2b8b0 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
2b8c0 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
2b8d0 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
2b8e0 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
2b8f0 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
2b900 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
2b910 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
2b920 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
2b930 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
2b940 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
2b950 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
2b960 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
2b970 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b980 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
2b990 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
2b9a0 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
2b9b0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74   *pDbPage;.  int
2b9c0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2b9d0 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
2b9e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2b9f0 70 42 74 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69  pBt;..  /* Readi
2ba00 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76  ng a meta-data v
2ba10 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61 20  alue requires a 
2ba20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
2ba30 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20  e 1 (and hence. 
2ba40 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   ** the sqlite_m
2ba50 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20  aster table. We 
2ba60 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72  grab this lock r
2ba70 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2ba80 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74  ther or.  ** not
2ba90 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64   the SQLITE_Read
2baa0 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
2bab0 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61 62   is set (the tab
2bac0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
2bad0 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61  e.  ** 1 is trea
2bae0 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c  ted as a special
2baf0 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54 61   case by queryTa
2bb00 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f  bleLock() and lo
2bb10 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f  ckTable())..  */
2bb20 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62  .  rc = queryTab
2bb30 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41  leLock(p, 1, REA
2bb40 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  D_LOCK);.  if( r
2bb50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bb60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2bb70 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
2bb80 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
2bb90 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2bba0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
2bbb0 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61  Pager, 1, &pDbPa
2bbc0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
2bbd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 31  return rc;.  pP1
2bbe0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
2bbf0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
2bc00 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
2bc10 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74  ;.  *pMeta = get
2bc20 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20  4byte(&pP1[36 + 
2bc30 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74  idx*4]);.  sqlit
2bc40 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
2bc50 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Page);..  /* If 
2bc60 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20  autovacuumed is 
2bc70 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73  disabled in this
2bc80 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61 72   build but we ar
2bc90 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a  e trying to .  *
2bca0 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f  * access an auto
2bcb0 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61 73  vacuumed databas
2bcc0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65  e, then make the
2bcd0 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e   database readon
2bce0 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ly. .  */.#ifdef
2bcf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2bd00 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64  OVACUUM.  if( id
2bd10 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30  x==4 && *pMeta>0
2bd20 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   ) pBt->readOnly
2bd30 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 1;.#endif..  
2bd40 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65 61 64  /* Grab the read
2bd50 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e  -lock on page 1.
2bd60 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54   */.  rc = lockT
2bd70 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f  able(p, 1, READ_
2bd80 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20  LOCK);.  return 
2bd90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
2bda0 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  te meta-informat
2bdb0 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ion back into th
2bdc0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
2bdd0 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d  a[0] is.** read-
2bde0 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74  only and may not
2bdf0 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a   be written..*/.
2be00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2be10 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65  UpdateMeta(Btree
2be20 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
2be30 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68  2 iMeta){.  BtSh
2be40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2be50 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2be60 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20  har *pP1;.  int 
2be70 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
2be80 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=1 && idx<=15 
2be90 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  );.  if( p->inTr
2bea0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2beb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2bec0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2bed0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2bee0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2bef0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
2bf00 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20  ->pPage1!=0 );. 
2bf10 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
2bf20 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  e1->aData;.  rc 
2bf30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2bf40 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
2bf50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
2bf60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2bf70 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31  .  put4byte(&pP1
2bf80 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d  [36 + idx*4], iM
2bf90 65 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  eta);.  return S
2bfa0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2bfb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c  ** Return the fl
2bfc0 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20 62  ag byte at the b
2bfd0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2bfe0 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63 75  page that the cu
2bff0 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
2c000 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
2c010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c020 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75 72  BtreeFlags(BtCur
2c030 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2c040 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75   TODO: What abou
2c050 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  t CURSOR_REQUIRE
2c060 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62  SEEK state? Prob
2c070 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c  ably need to cal
2c080 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72  l.  ** restoreOr
2c090 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2c0a0 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f  ion() here..  */
2c0b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2c0c0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2c0d0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 20  .  return pPage 
2c0e0 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  ? pPage->aData[p
2c0f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d  Page->hdrOffset]
2c100 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   : 0;.}.../*.** 
2c110 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72  Return the pager
2c120 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c130 20 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20   a BTree.  This 
2c140 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2c150 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2c160 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2c170 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c  y..*/.Pager *sql
2c180 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42  ite3BtreePager(B
2c190 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
2c1a0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  rn p->pBt->pPage
2c1b0 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  r;.}..#ifndef SQ
2c1c0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2c1d0 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
2c1e0 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65  Append a message
2c1f0 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65   to the error me
2c200 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f  ssage string..*/
2c210 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
2c220 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49  ckAppendMsg(.  I
2c230 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
2c240 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ck,.  char *zMsg
2c250 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
2c260 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a  *zFormat,.  ....
2c270 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
2c280 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 32 3b 0a  .  char *zMsg2;.
2c290 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d    if( !pCheck->m
2c2a0 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  xErr ) return;. 
2c2b0 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d   pCheck->mxErr--
2c2c0 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72  ;.  pCheck->nErr
2c2d0 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ++;.  va_start(a
2c2e0 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
2c2f0 4d 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d  Msg2 = sqlite3VM
2c300 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  Printf(zFormat, 
2c310 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
2c320 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d  );.  if( zMsg1==
2c330 30 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a  0 ) zMsg1 = "";.
2c340 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45    if( pCheck->zE
2c350 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61  rrMsg ){.    cha
2c360 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b  r *zOld = pCheck
2c370 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70  ->zErrMsg;.    p
2c380 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d  Check->zErrMsg =
2c390 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
2c3a0 65 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b  etString(&pCheck
2c3b0 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c  ->zErrMsg, zOld,
2c3c0 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d   "\n", zMsg1, zM
2c3d0 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  sg2, (char*)0);.
2c3e0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
2c3f0 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Old);.  }else{. 
2c400 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
2c410 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
2c420 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  rMsg, zMsg1, zMs
2c430 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
2c440 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
2c450 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66  zMsg2);.}.#endif
2c460 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2c470 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
2c480 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2c490 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2c4a0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64  Y_CHECK./*.** Ad
2c4b0 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72  d 1 to the refer
2c4c0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
2c4d0 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74  age iPage.  If t
2c4e0 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
2c4f0 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  d.** reference t
2c500 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20  o the page, add 
2c510 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2c520 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72   to pCheck->zErr
2c530 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31  Msg..** Return 1
2c540 20 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20   if there are 2 
2c550 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e  ore more referen
2c560 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2c570 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74  and 0 if.** if t
2c580 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
2c590 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2c5a0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  e page..**.** Al
2c5b0 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  so check that th
2c5c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
2c5d0 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73   in bounds..*/.s
2c5e0 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
2c5f0 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  ef(IntegrityCk *
2c600 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67  pCheck, int iPag
2c610 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  e, char *zContex
2c620 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  t){.  if( iPage=
2c630 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2c640 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63   if( iPage>pChec
2c650 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67  k->nPage || iPag
2c660 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  e<0 ){.    check
2c670 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2c680 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76  , zContext, "inv
2c690 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
2c6a0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
2c6b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2c6c0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e    if( pCheck->an
2c6d0 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b  Ref[iPage]==1 ){
2c6e0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
2c6f0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
2c700 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72  text, "2nd refer
2c710 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22  ence to page %d"
2c720 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
2c730 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2c740 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61  turn  (pCheck->a
2c750 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31  nRef[iPage]++)>1
2c760 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2c770 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2c780 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  UUM./*.** Check 
2c790 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
2c7a0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
2c7b0 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c  p for page iChil
2c7c0 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61  d maps to .** pa
2c7d0 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e  ge iParent, poin
2c7e0 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65  ter type ptrType
2c7f0 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64  . If not, append
2c800 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2c810 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a  e.** to pCheck..
2c820 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2c830 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e  heckPtrmap(.  In
2c840 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
2c850 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  k,   /* Integrit
2c860 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20  y check context 
2c870 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
2c880 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
2c890 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72  hild page number
2c8a0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c8c0 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
2c8d0 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50   map type */.  P
2c8e0 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20  gno iParent,    
2c8f0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
2c900 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  d pointer map pa
2c910 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
2c920 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
2c930 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20  text         /* 
2c940 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74  Context descript
2c950 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72  ion (used for er
2c960 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20  ror msg) */.){. 
2c970 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50   int rc;.  u8 eP
2c980 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e  trmapType;.  Pgn
2c990 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b  o iPtrmapParent;
2c9a0 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47  ..  rc = ptrmapG
2c9b0 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20  et(pCheck->pBt, 
2c9c0 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70  iChild, &ePtrmap
2c9d0 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61  Type, &iPtrmapPa
2c9e0 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
2c9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ca00 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2ca10 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
2ca20 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65  t, "Failed to re
2ca30 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64  ad ptrmap key=%d
2ca40 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ", iChild);.    
2ca50 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
2ca60 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d  f( ePtrmapType!=
2ca70 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70  eType || iPtrmap
2ca80 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20  Parent!=iParent 
2ca90 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2caa0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2cab0 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22  ontext, .      "
2cac0 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72  Bad ptr map entr
2cad0 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65  y key=%d expecte
2cae0 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25  d=(%d,%d) got=(%
2caf0 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69  d,%d)", .      i
2cb00 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50  Child, eType, iP
2cb10 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79  arent, ePtrmapTy
2cb20 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e  pe, iPtrmapParen
2cb30 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  t);.  }.}.#endif
2cb40 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
2cb50 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
2cb60 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f  he freelist or o
2cb70 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
2cb80 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69  ge list..** Veri
2cb90 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
2cba0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2cbb0 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f  he list is N..*/
2cbc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
2cbd0 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72  ckList(.  Integr
2cbe0 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
2cbf0 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
2cc00 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  cking context */
2cc10 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73  .  int isFreeLis
2cc20 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  t,       /* True
2cc30 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e   for a freelist.
2cc40 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72    False for over
2cc50 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a  flow page list *
2cc60 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
2cc70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2cc80 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72  e number for fir
2cc90 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  st page in the l
2cca0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  ist */.  int N, 
2ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ccc0 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65  * Expected numbe
2ccd0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2cce0 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  e list */.  char
2ccf0 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
2cd00 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
2cd10 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
2cd20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
2cd30 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20   int expected = 
2cd40 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  N;.  int iFirst 
2cd50 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65  = iPage;.  while
2cd60 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68  ( N-- > 0 && pCh
2cd70 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20  eck->mxErr ){.  
2cd80 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50    DbPage *pOvflP
2cd90 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  age;.    unsigne
2cda0 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74  d char *pOvflDat
2cdb0 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  a;.    if( iPage
2cdc0 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  <1 ){.      chec
2cdd0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2cde0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
2cdf0 20 20 20 20 20 20 22 25 64 20 6f 66 20 25 64 20        "%d of %d 
2ce00 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72  pages missing fr
2ce10 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  om overflow list
2ce20 20 73 74 61 72 74 69 6e 67 20 61 74 20 25 64 22   starting at %d"
2ce30 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c  ,.          N+1,
2ce40 20 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73   expected, iFirs
2ce50 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
2ce60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
2ce70 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
2ce80 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
2ce90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
2cea0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
2ceb0 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72  t(pCheck->pPager
2cec0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
2ced0 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20  pOvflPage) ){.  
2cee0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
2cef0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
2cf00 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ext, "failed to 
2cf10 67 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50  get page %d", iP
2cf20 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  age);.      brea
2cf30 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76  k;.    }.    pOv
2cf40 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e  flData = (unsign
2cf50 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
2cf60 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 4f  3PagerGetData(pO
2cf70 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66  vflPage);.    if
2cf80 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a  ( isFreeList ){.
2cf90 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65        int n = ge
2cfa0 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
2cfb0 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  a[4]);.#ifndef S
2cfc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2cfd0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
2cfe0 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
2cff0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2d000 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
2d010 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54  Check, iPage, PT
2d020 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
2d030 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
2d040 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2d050 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e    if( n>pCheck->
2d060 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2d070 34 2d 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63  4-8 ){.        c
2d080 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2d090 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
2d0a0 20 20 20 20 20 20 20 20 20 20 20 22 66 72 65 65             "free
2d0b0 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20  list leaf count 
2d0c0 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20  too big on page 
2d0d0 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
2d0e0 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20       N--;.      
2d0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
2d100 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
2d110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  ){.          Pgn
2d120 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20 67 65  o iFreePage = ge
2d130 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
2d140 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64  a[8+i*4]);.#ifnd
2d150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2d160 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2d170 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
2d180 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2d190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
2d1a0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
2d1b0 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54  k, iFreePage, PT
2d1c0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
2d1d0 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
2d1e0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2d1f0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52            checkR
2d200 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ef(pCheck, iFree
2d210 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
2d220 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d230 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20     N -= n;.     
2d240 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
2d250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d260 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65  OVACUUM.    else
2d270 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
2d280 69 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70  is database supp
2d290 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2d2a0 20 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f   and iPage is no
2d2b0 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  t the last.     
2d2c0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
2d2d0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20   overflow list, 
2d2e0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  check that the p
2d2f0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2d300 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
2d310 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65  e following page
2d320 20 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a   matches iPage..
2d330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2d340 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
2d350 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e  autoVacuum && N>
2d360 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  0 ){.        i =
2d370 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44   get4byte(pOvflD
2d380 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68  ata);.        ch
2d390 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
2d3a0 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  , i, PTRMAP_OVER
2d3b0 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW2, iPage, zC
2d3c0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
2d3d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2d3e0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2d3f0 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
2d400 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2d410 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b  nref(pOvflPage);
2d420 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
2d430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
2d440 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
2d450 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d460 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
2d470 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61  HECK./*.** Do va
2d480 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65  rious sanity che
2d490 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  cks on a single 
2d4a0 70 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20  page of a tree. 
2d4b0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74   Return.** the t
2d4c0 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74  ree depth.  Root
2d4d0 20 70 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e   pages return 0.
2d4e0 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f    Parents of roo
2d4f0 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72  t pages.** retur
2d500 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  n 1, and so fort
2d510 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20  h..** .** These 
2d520 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a  checks are done:
2d530 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20  .**.**      1.  
2d540 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63  Make sure that c
2d550 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f  ells and freeblo
2d560 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c  cks do not overl
2d570 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62  ap.**          b
2d580 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f  ut combine to co
2d590 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74  mpletely cover t
2d5a0 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20  he page..**  NO 
2d5b0 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63   2.  Make sure c
2d5c0 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20  ell keys are in 
2d5d0 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33  order..**  NO  3
2d5e0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  .  Make sure no 
2d5f0 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e  key is less than
2d600 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f   or equal to zLo
2d610 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f  werBound..**  NO
2d620 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    4.  Make sure 
2d630 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74 65  no key is greate
2d640 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
2d650 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a  to zUpperBound..
2d660 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65 63  **      5.  Chec
2d670 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
2d680 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
2d690 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52  s..**      6.  R
2d6a0 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20  ecursively call 
2d6b0 63 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e  checkTreePage on
2d6c0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a   all children..*
2d6d0 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72 69 66  *      7.  Verif
2d6e0 79 20 74 68 61 74 20 74 68 65 20 64 65 70 74 68  y that the depth
2d6f0 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
2d700 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a   is the same..**
2d710 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73        8.  Make s
2d720 75 72 65 20 74 68 69 73 20 70 61 67 65 20 69 73  ure this page is
2d730 20 61 74 20 6c 65 61 73 74 20 33 33 25 20 66 75   at least 33% fu
2d740 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  ll or else it is
2d750 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65  .**          the
2d760 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
2d770 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2d780 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a   checkTreePage(.
2d790 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
2d7a0 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65  Check,  /* Conte
2d7b0 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74  xt for the sanit
2d7c0 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  y check */.  int
2d7d0 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
2d7e0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2d7f0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
2d800 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50   check */.  MemP
2d810 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
2d820 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
2d830 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72   */.  char *zPar
2d840 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50  entContext  /* P
2d850 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f  arent context */
2d860 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2d870 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72  Page;.  int i, r
2d880 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67  c, depth, d2, pg
2d890 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68  no, cnt;.  int h
2d8a0 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20  dr, cellStart;. 
2d8b0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38   int nCell;.  u8
2d8c0 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72   *data;.  BtShar
2d8d0 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75  ed *pBt;.  int u
2d8e0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61  sableSize;.  cha
2d8f0 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b  r zContext[100];
2d900 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20  .  char *hit;.. 
2d910 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2d920 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
2d930 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50  t), zContext, "P
2d940 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65  age %d: ", iPage
2d950 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
2d960 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69  hat the page exi
2d970 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d  sts.  */.  pBt =
2d980 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20   pCheck->pBt;.  
2d990 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
2d9a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
2d9b0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
2d9c0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63  eturn 0;.  if( c
2d9d0 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
2d9e0 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f  iPage, zParentCo
2d9f0 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20  ntext) ) return 
2da00 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73  0;.  if( (rc = s
2da10 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2da20 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50  ge(pBt, (Pgno)iP
2da30 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2da40 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
2da50 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2da60 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
2da70 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65     "unable to ge
2da80 74 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f  t the page. erro
2da90 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b  r code=%d", rc);
2daa0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dab0 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73   }.  if( (rc = s
2dac0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2dad0 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65  age(pPage, pPare
2dae0 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt))!=0 ){.    c
2daf0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2db00 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
2db10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2db20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65      "sqlite3Btre
2db30 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75  eInitPage() retu
2db40 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25  rns error code %
2db50 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c  d", rc);.    rel
2db60 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2db70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2db80 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f   }..  /* Check o
2db90 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  ut all the cells
2dba0 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d  ..  */.  depth =
2dbb0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
2dbc0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  <pPage->nCell &&
2dbd0 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20   pCheck->mxErr; 
2dbe0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
2dbf0 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  ell;.    int sz;
2dc00 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
2dc10 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  fo;..    /* Chec
2dc20 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c  k payload overfl
2dc30 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a  ow pages.    */.
2dc40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2dc50 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
2dc60 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
2dc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f  .             "O
2dc80 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63  n tree page %d c
2dc90 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
2dca0 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  , i);.    pCell 
2dcb0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2dcc0 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ,i);.    sqlite3
2dcd0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
2dce0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2dcf0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d  &info);.    sz =
2dd00 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20   info.nData;.   
2dd10 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
2dd20 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f  Key ) sz += info
2dd30 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72  .nKey;.    asser
2dd40 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79  t( sz==info.nPay
2dd50 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20  load );.    if( 
2dd60 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  sz>info.nLocal )
2dd70 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
2dd80 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e  e = (sz - info.n
2dd90 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69  Local + usableSi
2dda0 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53  ze - 5)/(usableS
2ddb0 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  ize - 4);.      
2ddc0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
2ddd0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
2dde0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
2ddf0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2de00 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2de10 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2de20 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2de30 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
2de40 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76  p(pCheck, pgnoOv
2de50 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
2de60 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW1, iPage, zCo
2de70 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
2de80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65  #endif.      che
2de90 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30  ckList(pCheck, 0
2dea0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67  , pgnoOvfl, nPag
2deb0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
2dec0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
2ded0 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74  k sanity of left
2dee0 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20   child page..   
2def0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
2df00 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2df10 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2df20 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  e(pCell);.#ifnde
2df30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2df40 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
2df50 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2df60 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
2df70 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
2df80 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
2df90 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f  TREE, iPage, zCo
2dfa0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
2dfb0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20  #endif.      d2 
2dfc0 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28  = checkTreePage(
2dfd0 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67  pCheck,pgno,pPag
2dfe0 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e,zContext);.   
2dff0 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32     if( i>0 && d2
2e000 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20  !=depth ){.     
2e010 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2e020 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2e030 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20  xt, "Child page 
2e040 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b  depth differs");
2e050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
2e060 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d  epth = d2;.    }
2e070 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
2e080 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
2e090 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
2e0a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2e0b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2e0c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
2e0d0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2e0e0 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
2e0f0 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  xt, .           
2e100 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61            "On pa
2e110 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63  ge %d at right c
2e120 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  hild: ", iPage);
2e130 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e140 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2e150 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2e160 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2e170 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
2e180 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
2e190 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
2e1a0 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
2e1b0 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
2e1c0 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ge(pCheck, pgno,
2e1d0 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   pPage, zContext
2e1e0 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68  );.  }. .  /* Ch
2e1f0 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65  eck for complete
2e200 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65   coverage of the
2e210 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74   page.  */.  dat
2e220 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2e230 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2e240 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69  >hdrOffset;.  hi
2e250 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
2e260 28 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ( usableSize );.
2e270 20 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20    if( hit ){.   
2e280 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20   memset(hit, 1, 
2e290 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2e2a0 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65  dr+5]));.    nCe
2e2b0 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
2e2c0 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
2e2d0 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72   cellStart = hdr
2e2e0 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
2e2f0 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69  >leaf;.    for(i
2e300 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
2e310 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20  ){.      int pc 
2e320 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2e330 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29  [cellStart+i*2])
2e340 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  ;.      int size
2e350 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2e360 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
2e370 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2e380 20 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a       if( (pc+siz
2e390 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
2e3a0 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20   || pc<0 ){.    
2e3b0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
2e3c0 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
2e3d0 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
2e3e0 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
2e3f0 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
2e400 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
2e410 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2e420 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63          for(j=pc
2e430 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20  +size-1; j>=pc; 
2e440 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
2e450 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e460 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65   for(cnt=0, i=ge
2e470 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2e480 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75  +1]); i>0 && i<u
2e490 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74  sableSize && cnt
2e4a0 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20  <10000; .       
2e4b0 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20      cnt++){.    
2e4c0 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74    int size = get
2e4d0 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d  2byte(&data[i+2]
2e4e0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2e4f0 20 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a        if( (i+siz
2e500 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
2e510 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20   || i<0 ){.     
2e520 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2e530 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20  g(pCheck, 0,  . 
2e540 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
2e550 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
2e560 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
2e570 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
2e580 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2e590 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
2e5a0 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d  size-1; j>=i; j-
2e5b0 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
2e5c0 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67     }.      i = g
2e5d0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d  et2byte(&data[i]
2e5e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
2e5f0 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62  (i=cnt=0; i<usab
2e600 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  leSize; i++){.  
2e610 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d      if( hit[i]==
2e620 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74  0 ){.        cnt
2e630 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
2e640 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a  if( hit[i]>1 ){.
2e650 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
2e660 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
2e670 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c  ,.          "Mul
2e680 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62  tiple uses for b
2e690 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25  yte %d of page %
2e6a0 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20  d", i, iPage);. 
2e6b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e6c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e6d0 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64  if( cnt!=data[hd
2e6e0 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68  r+7] ){.      ch
2e6f0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2e700 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
2e710 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73     "Fragmented s
2e720 70 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20  pace is %d byte 
2e730 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f  reported as %d o
2e740 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20  n page %d",.    
2e750 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b        cnt, data[
2e760 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a  hdr+7], iPage);.
2e770 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2e780 74 65 46 72 65 65 28 68 69 74 29 3b 0a 0a 20 20  teFree(hit);..  
2e790 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2e7a0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70  e);.  return dep
2e7b0 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  th+1;.}.#endif /
2e7c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
2e7d0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
2e7e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e7f0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
2e800 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CHECK./*.** This
2e810 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
2e820 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f  complete check o
2e830 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65  f the given BTre
2e840 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d  e file.  aRoot[]
2e850 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20   is.** an array 
2e860 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  of pages numbers
2e870 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20   were each page 
2e880 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f  number is the ro
2e890 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20  ot page of.** a 
2e8a0 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73  table.  nRoot is
2e8b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2e8c0 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e  ntries in aRoot.
2e8d0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
2e8e0 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c  hing checks out,
2e8f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2e900 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20  turns NULL.  If 
2e910 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20  something is.** 
2e920 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20  amiss, an error 
2e930 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
2e940 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
2e950 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
2e960 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70  loc().** and a p
2e970 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65  ointer to that e
2e980 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2e990 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63  returned.  The c
2e9a0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
2e9b0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
2e9c0 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
2e9d0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2e9e0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
2e9f0 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
2ea00 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
2ea10 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70  heck(.  Btree *p
2ea20 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72  ,     /* The btr
2ea30 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  ee to be checked
2ea40 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
2ea50 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20  ,   /* An array 
2ea60 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  of root pages nu
2ea70 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69  mbers for indivi
2ea80 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20  dual trees */.  
2ea90 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a  int nRoot,    /*
2eaa0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2eab0 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f  es in aRoot[] */
2eac0 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20  .  int mxErr,   
2ead0 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69   /* Stop reporti
2eae0 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20  ng errors after 
2eaf0 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69  this many */.  i
2eb00 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20  nt *pnErr    /* 
2eb10 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  Write number of 
2eb20 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74  errors seen to t
2eb30 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  his variable */.
2eb40 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
2eb50 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72  t nRef;.  Integr
2eb60 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20  ityCk sCheck;.  
2eb70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2eb80 70 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52 65 66 20  p->pBt;..  nRef 
2eb90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
2eba0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
2ebb0 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
2ebc0 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
2ebd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ebe0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2ebf0 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74  StrDup("Unable t
2ec00 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
2ec10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2ec20 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73  abase");.  }.  s
2ec30 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b  Check.pBt = pBt;
2ec40 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72  .  sCheck.pPager
2ec50 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
2ec60 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
2ec70 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
2ec80 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50  ecount(sCheck.pP
2ec90 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e  ager);.  sCheck.
2eca0 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20  mxErr = mxErr;. 
2ecb0 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30   sCheck.nErr = 0
2ecc0 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a  ;.  *pnErr = 0;.
2ecd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ece0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2ecf0 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
2ed00 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68 65 63  !=0 ){.    sChec
2ed10 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e  k.nPage = pBt->n
2ed20 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  Trunc;.  }.#endi
2ed30 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  f.  if( sCheck.n
2ed40 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75  Page==0 ){.    u
2ed50 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
2ed60 65 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65 74  ed(pBt);.    ret
2ed70 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
2ed80 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
2ed90 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73 43  teMallocRaw( (sC
2eda0 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
2edb0 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
2edc0 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
2edd0 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
2ede0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
2edf0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
2ee00 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20    *pnErr = 1;.  
2ee10 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2ee20 4d 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65 20  MPrintf("Unable 
2ee30 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74  to malloc %d byt
2ee40 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73  es", .        (s
2ee50 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
2ee60 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
2ee70 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66  ef[0]));.  }.  f
2ee80 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63  or(i=0; i<=sChec
2ee90 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73  k.nPage; i++){ s
2eea0 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d  Check.anRef[i] =
2eeb0 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44   0; }.  i = PEND
2eec0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2eed0 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68  t);.  if( i<=sCh
2eee0 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20  eck.nPage ){.   
2eef0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
2ef00 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65   = 1;.  }.  sChe
2ef10 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  ck.zErrMsg = 0;.
2ef20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
2ef30 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
2ef40 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20   freelist.  */. 
2ef50 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65   checkList(&sChe
2ef60 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28  ck, 1, get4byte(
2ef70 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
2ef80 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20  ata[32]),.      
2ef90 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
2efa0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
2efb0 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66  ta[36]), "Main f
2efc0 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20  reelist: ");..  
2efd0 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65  /* Check all the
2efe0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2eff0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74  for(i=0; i<nRoot
2f000 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
2f010 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2f020 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f  aRoot[i]==0 ) co
2f030 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
2f040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2f050 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2f060 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2f070 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a  & aRoot[i]>1 ){.
2f080 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
2f090 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  p(&sCheck, aRoot
2f0a0 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  [i], PTRMAP_ROOT
2f0b0 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  PAGE, 0, 0);.   
2f0c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
2f0d0 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68  eckTreePage(&sCh
2f0e0 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30  eck, aRoot[i], 0
2f0f0 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20  , "List of tree 
2f100 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a  roots: ");.  }..
2f110 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
2f120 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
2f130 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e   file is referen
2f140 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ced.  */.  for(i
2f150 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =1; i<=sCheck.nP
2f160 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78  age && sCheck.mx
2f170 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  Err; i++){.#ifde
2f180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2f190 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2f1a0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
2f1b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ==0 ){.      che
2f1c0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
2f1d0 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
2f1e0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
2f1f0 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   i);.    }.#else
2f200 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
2f210 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2f220 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61   auto-vacuum, ma
2f230 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65  ke sure no table
2f240 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  s contain.    **
2f250 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70   references to p
2f260 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
2f270 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2f280 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
2f290 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  ==0 && .       (
2f2a0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2f2b0 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74  t, i)!=i || !pBt
2f2c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
2f2d0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
2f2e0 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
2f2f0 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
2f300 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
2f310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68     }.    if( sCh
2f320 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20  eck.anRef[i]!=0 
2f330 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
2f340 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
2f350 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
2f360 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
2f370 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2f380 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
2f390 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
2f3a0 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
2f3b0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
2f3c0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
2f3d0 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
2f3e0 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
2f3f0 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
2f400 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
2f410 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
2f420 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
2f430 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   != sqlite3Pager
2f440 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
2f450 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65  ager) ){.    che
2f460 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
2f470 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22  eck, 0, .      "
2f480 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  Outstanding page
2f490 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d   count goes from
2f4a0 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67   %d to %d during
2f4b0 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c   this analysis",
2f4c0 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c  .      nRef, sql
2f4d0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
2f4e0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20  t(pBt->pPager). 
2f4f0 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
2f500 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65  Clean  up and re
2f510 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a  port errors..  *
2f520 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73  /.  sqliteFree(s
2f530 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
2f540 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e  *pnErr = sCheck.
2f550 6e 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  nErr;.  return s
2f560 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d  Check.zErrMsg;.}
2f570 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2f580 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
2f590 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
2f5a0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2f5b0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2f5c0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
2f5d0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
2f5e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
2f5f0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
2f600 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
2f610 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
2f620 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
2f630 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
2f640 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74  rFilename(p->pBt
2f650 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
2f660 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
2f670 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
2f680 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
2f690 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
2f6a0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
2f6b0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
2f6c0 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
2f6d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
2f6e0 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
2f6f0 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
2f700 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  rn sqlite3PagerD
2f710 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
2f720 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
2f730 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
2f740 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
2f750 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
2f760 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
2f770 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
2f780 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
2f790 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
2f7a0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2f7b0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
2f7c0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
2f7d0 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
2f7e0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2f7f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
2f800 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a  rnalname(Btree *
2f810 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
2f820 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
2f830 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
2f840 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
2f850 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
2f860 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  er);.}..#ifndef 
2f870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
2f880 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  UM./*.** Copy th
2f890 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
2f8a0 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e  nt of pBtFrom in
2f8b0 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61  to pBtTo.  A tra
2f8c0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
2f8d0 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62   be active for b
2f8e0 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  oth files..**.**
2f8f0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c   The size of fil
2f900 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62 65  e pBtFrom may be
2f910 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73   reduced by this
2f920 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   operation..** I
2f930 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
2f940 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73  wrong, the trans
2f950 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f  action on pBtFro
2f960 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  m is rolled back
2f970 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f980 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  BtreeCopyFile(Bt
2f990 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
2f9a0 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
2f9b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f9c0 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20   Pgno i, nPage, 
2f9d0 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a  nToPage, iSkip;.
2f9e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2f9f0 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20  To = pTo->pBt;. 
2fa00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72   BtShared *pBtFr
2fa10 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  om = pFrom->pBt;
2fa20 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54  ..  if( pTo->inT
2fa30 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2fa40 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72  E || pFrom->inTr
2fa50 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2fa60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2fa70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2fa80 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43  .  if( pBtTo->pC
2fa90 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53  ursor ) return S
2faa0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54  QLITE_BUSY;.  nT
2fab0 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  oPage = sqlite3P
2fac0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
2fad0 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
2fae0 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  nPage = sqlite3P
2faf0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
2fb00 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a  tFrom->pPager);.
2fb10 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e    iSkip = PENDIN
2fb20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
2fb30 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  o);.  for(i=1; r
2fb40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fb50 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
2fb60 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
2fb70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
2fb80 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
2fb90 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2fba0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
2fbb0 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  om->pPager, i, &
2fbc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2fbd0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2fbe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2fbf0 67 65 72 4f 76 65 72 77 72 69 74 65 28 70 42 74  gerOverwrite(pBt
2fc00 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 73  To->pPager, i, s
2fc10 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
2fc20 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a 20 20  ta(pDbPage));.  
2fc30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2fc40 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
2fc50 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  }..  /* If the f
2fc60 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69 6e 67  ile is shrinking
2fc70 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20 70 61  , journal the pa
2fc80 67 65 73 20 74 68 61 74 20 61 72 65 20 62 65 69  ges that are bei
2fc90 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20 20 2a  ng truncated.  *
2fca0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  * so that they c
2fcb0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
2fcc0 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  k if the commit 
2fcd0 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  fails..  */.  fo
2fce0 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d  r(i=nPage+1; rc=
2fcf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
2fd00 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  =nToPage; i++){.
2fd10 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
2fd20 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
2fd30 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
2fd40 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2fd50 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f  e3PagerGet(pBtTo
2fd60 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44  ->pPager, i, &pD
2fd70 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2fd80 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
2fd90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fda0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
2fdb0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2fdc0 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61  rDontWrite(pDbPa
2fdd0 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65 61 68  ge);.    /* Yeah
2fde0 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72  .  It seems wier
2fdf0 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72  d to call DontWr
2fe00 69 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65  ite() right afte
2fe10 72 20 57 72 69 74 65 28 29 2e 20 20 42 75 74 0a  r Write().  But.
2fe20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62      ** that is b
2fe30 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73  ecause the names
2fe40 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64   of those proced
2fe50 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63  ures do not exac
2fe60 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65 70 72  tly .    ** repr
2fe70 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20  esent what they 
2fe80 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61  do.  Write() rea
2fe90 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74  lly means "put t
2fea0 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a  his page in the.
2feb0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
2fec0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b  journal and mark
2fed0 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20   it as dirty so 
2fee0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
2fef0 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 74  written.    ** t
2ff00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2ff10 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e  ile later."  Don
2ff20 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20  tWrite() undoes 
2ff30 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20  the second part 
2ff40 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61  of.    ** that a
2ff50 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  nd prevents the 
2ff60 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20  page from being 
2ff70 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
2ff80 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a 20 20  atabase.  The.  
2ff90 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74 69    ** page is sti
2ffa0 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ll on the rollba
2ffb0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75  ck journal, thou
2ffc0 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69 73  gh.  And that is
2ffd0 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20 20 2a   the whole.    *
2ffe0 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20  * point of this 
2fff0 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70 61 67  loop: to put pag
30000 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  es on the rollba
30010 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ck journal. */. 
30020 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
30030 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
30040 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20   }.  if( !rc && 
30050 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b  nPage<nToPage ){
30060 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
30070 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
30080 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50  BtTo->pPager, nP
30090 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
300a0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
300b0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
300c0 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
300d0 72 6e 20 72 63 3b 20 20 0a 7d 0a 23 65 6e 64 69  rn rc;  .}.#endi
300e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
300f0 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  _VACUUM */../*.*
30100 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
30110 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  o if a transacti
30120 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
30130 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
30140 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65  eIsInTrans(Btree
30150 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
30160 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73  p && (p->inTrans
30170 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b  ==TRANS_WRITE));
30180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
30190 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73   non-zero if a s
301a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
301b0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
301c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
301d0 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65  reeIsInStmt(Btre
301e0 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
301f0 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42  (p->pBt && p->pB
30200 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  t->inStmt);.}../
30210 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
30220 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64 20 28  zero if a read (
30230 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
30240 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
30250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
30260 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
30270 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  s(Btree *p){.  r
30280 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
30290 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
302a0 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ONE));.}../*.** 
302b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
302c0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
302d0 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d  to a blob of mem
302e0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
302f0 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  ith.** a single 
30300 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54 68  shared-btree. Th
30310 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
30320 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65 20   by client code 
30330 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a 2a 2a 20  for it's own.** 
30340 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65 78  purposes (for ex
30350 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20  ample, to store 
30360 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63 68  a high-level sch
30370 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ema associated w
30380 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61 72  ith .** the shar
30390 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20 62  ed-btree). The b
303a0 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61 67  tree layer manag
303b0 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  es reference cou
303c0 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a  nting issues..**
303d0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
303e0 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
303f0 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62 74  d on a shared-bt
30400 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74 65  ree, nBytes byte
30410 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  s of memory.** a
30420 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65  re allocated, ze
30430 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72 6e  roed, and return
30440 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
30450 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73 65  . For each subse
30460 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74  quent .** call t
30470 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65  he nBytes parame
30480 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 61  ter is ignored a
30490 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
304a0 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a  the same blob.**
304b0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75 72   of memory retur
304c0 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74  ned. .**.** Just
304d0 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61 72   before the shar
304e0 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f 73  ed-btree is clos
304f0 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
30500 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
30510 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65 6e  ** xFree argumen
30520 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72  t when the memor
30530 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73  y allocation was
30540 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65 64   made is invoked
30550 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62   on the .** blob
30560 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65   of allocated me
30570 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74  mory. This funct
30580 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ion should not c
30590 61 6c 6c 20 73 71 6c 69 74 65 46 72 65 65 28 29  all sqliteFree()
305a0 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72  .** on the memor
305b0 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  y, the btree lay
305c0 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f  er does that..*/
305d0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74  .void *sqlite3Bt
305e0 72 65 65 53 63 68 65 6d 61 28 42 74 72 65 65 20  reeSchema(Btree 
305f0 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73 2c 20  *p, int nBytes, 
30600 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76 6f 69  void(*xFree)(voi
30610 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61 72 65  d *)){.  BtShare
30620 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
30630 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63  .  if( !pBt->pSc
30640 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
30650 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  >pSchema = sqlit
30660 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b  eMalloc(nBytes);
30670 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53  .    pBt->xFreeS
30680 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20  chema = xFree;. 
30690 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d   }.  return pBt-
306a0 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a  >pSchema;.}../*.
306b0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
306c0 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20 6f  f another user o
306d0 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72 65  f the same share
306e0 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20 61  d btree as the a
306f0 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c  rgument.** handl
30700 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  e holds an exclu
30710 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
30720 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
30730 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
30740 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c  ite3BtreeSchemaL
30750 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b  ocked(Btree *p){
30760 0a 20 20 72 65 74 75 72 6e 20 28 71 75 65 72 79  .  return (query
30770 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
30780 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
30790 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  OCK)!=SQLITE_OK)
307a0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
307b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
307c0 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74  _CACHE./*.** Obt
307d0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ain a lock on th
307e0 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
307f0 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e  ot page is iTab.
30800 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73    The.** lock is
30810 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
30820 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20   isWritelock is 
30830 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c  true or a read l
30840 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  ock.** if it is 
30850 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
30860 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
30870 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
30880 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69  t iTab, u8 isWri
30890 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  teLock){.  int r
308a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
308b0 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28   u8 lockType = (
308c0 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54  isWriteLock?WRIT
308d0 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b  E_LOCK:READ_LOCK
308e0 29 3b 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54  );.  rc = queryT
308f0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
30900 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 69  , lockType);.  i
30910 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30920 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63   ){.    rc = loc
30930 6b 54 61 62 6c 65 28 70 2c 20 69 54 61 62 2c 20  kTable(p, iTab, 
30940 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 7d 0a 20  lockType);.  }. 
30950 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
30960 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
30970 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
30980 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  OB./*.** Argumen
30990 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61  t pCsr must be a
309a0 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66   cursor opened f
309b0 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e  or writing on an
309c0 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c   .** INTKEY tabl
309d0 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
309e0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
309f0 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a  table entry. .**
30a00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
30a10 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61  odifies the data
30a20 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
30a30 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a  of that entry..*
30a40 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  * Only the data 
30a50 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79  content may only
30a60 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74   be modified, it
30a70 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
30a80 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
30a90 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
30aa0 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  data stored..*/.
30ab0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
30ac0 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72  PutData(BtCursor
30ad0 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73   *pCsr, u32 offs
30ae0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
30af0 64 20 2a 7a 29 7b 0a 0a 20 20 61 73 73 65 72 74  d *z){..  assert
30b00 28 70 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f  (pCsr->isIncrblo
30b10 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69 66 28 20  bHandle);.  if( 
30b20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCsr->eState==CU
30b30 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
30b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
30b50 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
30b60 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d  ..  /* Check som
30b70 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  e preconditions:
30b80 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65   .  **   (a) the
30b90 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
30ba0 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a  for writing,.  *
30bb0 2a 20 20 20 28 62 29 20 74 68 65 72 65 20 69 73  *   (b) there is
30bc0 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   no read-lock on
30bd0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
30be0 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 0a 20 20   modified and.  
30bf0 2a 2a 20 20 20 28 63 29 20 74 68 65 20 63 75 72  **   (c) the cur
30c00 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  sor points at a 
30c10 76 61 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e 20  valid row of an 
30c20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20  intKey table..  
30c30 2a 2f 0a 20 20 69 66 28 20 21 70 43 73 72 2d 3e  */.  if( !pCsr->
30c40 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
30c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
30c60 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ONLY;.  }.  asse
30c70 72 74 28 20 21 70 43 73 72 2d 3e 70 42 74 72 65  rt( !pCsr->pBtre
30c80 65 2d 3e 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  e->pBt->readOnly
30c90 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70   .          && p
30ca0 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Csr->pBtree->pBt
30cb0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
30cc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
30cd0 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
30ce0 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65  ocks(pCsr->pBtre
30cf0 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCsr->pgnoRoo
30d00 74 2c 20 70 43 73 72 29 20 29 7b 0a 20 20 20 20  t, pCsr) ){.    
30d10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
30d20 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
30d30 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
30d40 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
30d50 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
30d60 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
30d70 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21  SOR_INVALID || !
30d80 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCsr->pPage->int
30d90 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
30da0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
30db0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63    }..  return ac
30dc0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72  cessPayload(pCsr
30dd0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
30de0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
30df0 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20  z, 0, 1);.}../* 
30e00 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f  .** Set a flag o
30e10 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f  n this cursor to
30e20 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74   cache the locat
30e30 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72  ions of pages fr
30e40 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66  om the .** overf
30e50 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65  low list for the
30e60 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68   current row. Th
30e70 69 73 20 69 73 20 75 73 65 64 20 62 79 20 63 75  is is used by cu
30e80 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
30e90 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  for incremental 
30ea0 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a  blob IO only..**
30eb0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30ec0 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e  n sets a flag on
30ed0 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70  ly. The actual p
30ee0 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63  age location cac
30ef0 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e  he.** (stored in
30f00 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
30f10 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61  low[]) is alloca
30f20 74 65 64 20 61 6e 64 20 75 73 65 64 20 62 79 20  ted and used by 
30f30 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65  function.** acce
30f40 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65  ssPayload() (the
30f50 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e   worker function
30f60 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   for sqlite3Btre
30f70 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73  eData() and.** s
30f80 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
30f90 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ta())..*/.void s
30fa0 71 6c 69 74 65 33 42 74 72 65 65 43 61 63 68 65  qlite3BtreeCache
30fb0 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72 73 6f  Overflow(BtCurso
30fc0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
30fd0 72 74 28 21 70 43 75 72 2d 3e 69 73 49 6e 63 72  rt(!pCur->isIncr
30fe0 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61  blobHandle);.  a
30ff0 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
31000 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
31010 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
31020 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  e = 1;.}.#endif.