/ Hex Artifact Content
Login

Artifact 2b122b7d7dec94670ecaa70f92397406100036aa:


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 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0400: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0410: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0420: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0430: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0440: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0450: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0460: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0470: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0480: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0490: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
04c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
04d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
04e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
04f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0500: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0510: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0520: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0530: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0540: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0550: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0560: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0570: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0580: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0590: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
05a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
05b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
05c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
05d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
05e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
05f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0600: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0610: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0620: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0630: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0640: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0650: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0660: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0670: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0680: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0690: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
06a0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
06b0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
06c0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
06d0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
06e0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
06f0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0700: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0710: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0720: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0730: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0740: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0750: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0790: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
07a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
07b0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
07c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
07d0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
07e0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
07f0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0800: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0810: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0820: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0830: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0840: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0850: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0860: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0870: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0880: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0890: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
08a0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
08b0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
08c0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
08d0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
08e0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
08f0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0900: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0910: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0920: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0930: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0940: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0950: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0960: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0970: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0980: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0990: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
09a0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
09b0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
09c0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
09d0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
09e0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
09f0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0a10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0a20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0a30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0a40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0a50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0a60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0a70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0a80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0a90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0aa0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0ab0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ac0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ad0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ae0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0af0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0b00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0b20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0b30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0b40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0b50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0b60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0b70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0b80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0b90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0ba0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0bb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0bc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0bd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0be0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0bf0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
0c00: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
0c10: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c20: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
0c30: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
0c40: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
0c50: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
0c60: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
0c70: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
0c80: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
0c90: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
0ca0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
0cb0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
0cc0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
0cd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
0ce0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
0cf0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d00: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d10: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d20: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d30: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
0d40: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
0d50: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
0d60: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
0d70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0d80: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
0d90: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
0da0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
0db0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
0dc0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
0dd0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
0de0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
0df0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
0e00: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
0e10: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
0e20: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
0e30: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
0e40: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
0e50: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
0e60: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
0e70: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
0e80: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
0e90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ea0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
0eb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
0ec0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
0ed0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
0ee0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
0ef0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
0f00: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
0f10: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
0f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0f30: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
0f40: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
0f50: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
0f60: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
0f70: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
0f80: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
0f90: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0fa0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
0fb0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
0fc0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
0fd0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
0fe0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
0ff0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1000: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1010: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1020: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1030: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1040: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1050: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1060: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1070: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1080: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1090: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
10a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
10b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
10c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
10d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
10e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
10f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1100: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1110: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1120: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1130: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1140: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1150: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1160: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1170: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1180: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1190: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
11a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
11b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
11c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
11d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
11e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
11f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1200: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1210: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1220: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1230: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1240: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1250: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1260: 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  ->flags&DB_Schem
1270: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1280: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1290: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
12a0: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
12b0: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
12c0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
12d0: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
12e0: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
12f0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1300: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1310: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1320: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1330: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1340: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1350: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1360: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1370: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1380: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1390: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
13a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
13b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
13c0: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
13d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
13e0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
13f0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1400: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1410: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1420: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61  t ){.        iTa
1440: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1450: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1460: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1470: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1480: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1490: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
14a0: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
14b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
14c0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
14d0: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
14e0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
14f0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1500: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1510: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1520: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1530: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1540: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1550: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1560: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1570: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1580: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1590: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
15a0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
15b0: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
15c0: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
15d0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
15e0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
15f0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1600: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1610: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1620: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1630: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1640: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1650: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1660: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1670: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1680: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
16a0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
16b0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
16c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16d0: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
16e0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
16f0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1700: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1710: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1720: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1730: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
1740: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
1750: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
1760: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
1770: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
1780: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
1790: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
17a0: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
17b0: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
17c0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
17d0: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
17e0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
17f0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
1800: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
1810: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
1820: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
1830: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
1840: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1850: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
1860: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
1870: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
1880: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
1890: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
18a0: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
18b0: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
18c0: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
18d0: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
18e0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
18f0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
1900: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
1910: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1920: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
1930: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
1940: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
1950: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
1960: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
1970: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
1980: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
1990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
19a0: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
19b0: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
19c0: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
19d0: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
19e0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
19f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1a00: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1a10: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
1a20: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
1a30: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
1a40: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
1a50: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
1a60: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
1a70: 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20  mitted).    ){. 
1a80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1aa0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  n 0;.}.#endif   
1ab0: 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54   /* #ifdef SQLIT
1ac0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1ad0: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
1ae0: 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f Btree handle p
1af0: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
1b00: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
1b10: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
1b20: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
1b30: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1b40: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
1b50: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
1b60: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
1b70: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
1b80: 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   (by calling.** 
1b90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1ba0: 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53  bleLock()), or S
1bb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
1bc0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
1bd0: 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61  nt querySharedCa
1be0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
1bf0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
1c00: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
1c10: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c20: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
1c30: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
1c40: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c50: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c60: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
1c70: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
1c80: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ca0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
1cb0: 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  t( !(p->db->flag
1cc0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
1cd0: 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b  ommitted)||eLock
1ce0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54  ==WRITE_LOCK||iT
1cf0: 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a  ab==1 );.  .  /*
1d00: 20 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61   If requesting a
1d10: 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65   write-lock, the
1d20: 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74  n the Btree must
1d30: 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1d40: 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ite.  ** transac
1d50: 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c  tion on this fil
1d60: 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c  e. And, obviousl
1d70: 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62  y, for this to b
1d80: 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a  e so there .  **
1d90: 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1da0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1db0: 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  on on the file i
1dc0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73  tself..  */.  as
1dd0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1de0: 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42  D_LOCK || (p==pB
1df0: 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d  t->pWriter && p-
1e00: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e10: 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65  WRITE) );.  asse
1e20: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1e30: 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  LOCK || pBt->inT
1e40: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e50: 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20  S_WRITE );.  .  
1e60: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1e70: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1e80: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1e90: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1ea0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1eb0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1ec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ed0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
1ee0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1ef0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
1f00: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
1f10: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
1f20: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
1f30: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
1f40: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
1f50: 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73  er!=p && pBt->is
1f60: 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1f70: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1f80: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1f90: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1fa0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
1fb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1fc0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
1fd0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1fe0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1ff0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2000: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2010: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2020: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2030: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2040: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2050: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2060: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2070: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2080: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2090: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
20a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
20b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
20c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
20d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
20e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
20f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2100: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2110: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2120: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2130: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2140: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2150: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2160: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2180: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2190: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
21a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
21b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
21d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
21e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
21f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2200: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2210: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2220: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2230: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2240: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2250: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2260: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2270: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2280: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2290: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
22a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
22b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
22c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
22d0: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
22e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2300: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
2310: 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  HE;.    }.  }.  
2320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2330: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
2340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2350: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
2360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2370: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
2380: 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e  ** Add a lock on
2390: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
23a0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
23b0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
23c0: 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20  tree used.** by 
23d0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20  Btree handle p. 
23e0: 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20  Parameter eLock 
23f0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52  must be either R
2400: 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20  EAD_LOCK or .** 
2410: 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  WRITE_LOCK..**.*
2420: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2430: 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c  assumes the foll
2440: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  owing:.**.**   (
2450: 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64  a) The specified
2460: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20   Btree object p 
2470: 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
2480: 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20  a sharable.**   
2490: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e      database (on
24a0: 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61  e with the BtSha
24b0: 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61  red.sharable fla
24c0: 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  g set), and.**.*
24d0: 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72  *   (b) No other
24e0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68   Btree objects h
24f0: 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20  old a lock that 
2500: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20  conflicts.**    
2510: 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75     with the requ
2520: 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e  ested lock (i.e.
2530: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
2540: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73  eTableLock() has
2550: 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64  .**       alread
2560: 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e  y been called an
2570: 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  d returned SQLIT
2580: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  E_OK)..**.** SQL
2590: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25a0: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
25b0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
25c0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d  ully. SQLITE_NOM
25d0: 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  EM .** is return
25e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61  ed if a malloc a
25f0: 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f  ttempt fails..*/
2600: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53  .static int setS
2610: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2620: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
2630: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
2640: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
2650: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2660: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
2670: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
2680: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2690: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
26a0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
26b0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
26c0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
26d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
26e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
26f0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63  !=0 );..  /* A c
2700: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74  onnection with t
2710: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
2720: 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c  ted flag set wil
2730: 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20  l never try to. 
2740: 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61   ** obtain a rea
2750: 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69  d-lock using thi
2760: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  s function. The 
2770: 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  only read-lock o
2780: 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20  btained.  ** by 
2790: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  a connection in 
27a0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
27b0: 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20   mode is on the 
27c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20  sqlite_master . 
27d0: 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74   ** table, and t
27e0: 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  hat lock is obta
27f0: 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67  ined in BtreeBeg
2800: 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20  inTrans().  */. 
2810: 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e   assert( 0==(p->
2820: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
2830: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2840: 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  ) || eLock==WRIT
2850: 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
2860: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2870: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2880: 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c  led on a sharabl
2890: 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69  e b-tree after i
28a0: 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  t .  ** has been
28b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
28c0: 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65   no other b-tree
28d0: 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63   holds a conflic
28e0: 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  ting lock.  */. 
28f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
2900: 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
2910: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
2920: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
2930: 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
2940: 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f  , eLock) );..  /
2950: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
2960: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
2970: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
2980: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
2990: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
29a0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
29b0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
29c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
29d0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
29e0: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
29f0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
2a00: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
2a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2a30: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
2a40: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
2a50: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
2a60: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
2a70: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
2a80: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
2a90: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
2aa0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
2ab0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
2ac0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
2ad0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
2ae0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
2af0: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
2b00: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2b30: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
2b40: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
2b50: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
2b60: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
2b70: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
2b80: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
2b90: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
2ba0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
2bb0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
2bc0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
2bd0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2be0: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
2bf0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2c00: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
2c10: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
2c20: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
2c30: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
2c40: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
2c50: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
2c60: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
2c70: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
2c80: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
2c90: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
2ca0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
2cb0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
2cc0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
2cd0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
2ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2cf0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2d00: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2d10: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2d30: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
2d40: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
2d50: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
2d60: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
2d70: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
2d80: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2d90: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
2da0: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
2db0: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
2dc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2dd0: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
2de0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2df0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2e00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2e10: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2e20: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2e30: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2e40: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2e50: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2e60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2e70: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2e80: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2e90: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2ea0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2eb0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2ec0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2ed0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2ef0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2f00: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2f10: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2f20: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2f30: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2f40: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2f50: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2f60: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2f80: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2f90: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2fa0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2fb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2fc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2fd0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2fe0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ff0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3000: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
3010: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
3020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3030: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3040: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
3050: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
3060: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
3070: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3080: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30a0: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
30b0: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
30c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
30d0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
30e0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
30f0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
3100: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3110: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3120: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3130: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3140: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3150: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3160: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3170: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3180: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3190: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31a0: 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20  when Btree p is 
31b0: 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a  concluding its .
31c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
31d0: 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72  on. If there cur
31e0: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20  rently exists a 
31f0: 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73  writer, and p is
3200: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   not.    ** that
3210: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68   writer, then th
3220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  e number of lock
3230: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
3240: 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20  tions other.    
3250: 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74  ** than the writ
3260: 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74  er must be about
3270: 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f   to drop to zero
3280: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
3290: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73     ** set the is
32a0: 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20  Pending flag to 
32b0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
32c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
32d0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
32e0: 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72  ter, then BtShar
32f0: 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73  ed.isPending mus
3300: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3310: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3320: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3330: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3340: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3350: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
3360: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3380: 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74  changes all writ
3390: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  e-locks held by 
33a0: 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61  Btree p into rea
33b0: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
33c0: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
33d0: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
33e0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
33f0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
3400: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3410: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3420: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3430: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3440: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3450: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
3460: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
3470: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3480: 30 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b  0;.    for(pLock
3490: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  =pBt->pLock; pLo
34a0: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
34b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
34c0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c  ssert( pLock->eL
34d0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
34e0: 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  | pLock->pBtree=
34f0: 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63  =p );.      pLoc
3500: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  k->eLock = READ_
3510: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3520: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3530: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3540: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
3550: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3560: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
3570: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
3580: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
3590: 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  ***** This routi
35a0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
35b0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e  e of assert() on
35c0: 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65  ly ****.**.** Ve
35d0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
35e0: 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d  rsor holds the m
35f0: 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68  utex on its BtSh
3600: 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ared.*/.#ifdef S
3610: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
3620: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
3630: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
3640: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
3650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3660: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
3670: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
3680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3690: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
36a0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
36b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
36c0: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
36d0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
36e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36f0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3700: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
3710: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
3720: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
3730: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
3740: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
3750: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
3760: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
3770: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
3780: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3790: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
37a0: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
37b0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
37c0: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
37d0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
37e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37f0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
3800: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
3810: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
3820: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
3830: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3840: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3850: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
3860: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
3870: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
3880: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
3890: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
38a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
38c0: 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  ed before modify
38d0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
38e0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74   of a table.** t
38f0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  o invalidate any
3900: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
3910: 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  s that are open 
3920: 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72  on the.** row or
3930: 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73   one of the rows
3940: 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
3950: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
3960: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3970: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
3980: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
3990: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s of the.** tabl
39a0: 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
39b0: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
39c0: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
39d0: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a  e all incrblob.*
39e0: 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
39f0: 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e  n any row within
3a00: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
3a10: 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f  root-page pgnoRo
3a20: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ot..**.** Otherw
3a30: 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74  ise, if argument
3a40: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3a50: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65   false, then the
3a60: 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77   row with.** row
3a70: 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67  id iRow is being
3a80: 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c   replaced or del
3a90: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3aa0: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a  se invalidate.**
3ab0: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72   only those incr
3ac0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
3ad0: 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66  n on that specif
3ae0: 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  ic row..*/.stati
3af0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3b00: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3b10: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
3b20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3b40: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
3b50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
3b60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
3b70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
3b80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
3b90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3bb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
3bc0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
3bd0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
3be0: 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
3bf0: 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
3c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c10: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3c20: 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
3c30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3c40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3c50: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  t){.    if( p->i
3c60: 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
3c70: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
3c80: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
3c90: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
3ca0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
3cb0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
3cc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
3cd0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
3ce0: 6f 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ons when INCRBLO
3cf0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
3d00: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3d10: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d20: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
3d30: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3d40: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
3d50: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3d60: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3d70: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
3d80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
3d90: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
3da0: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
3db0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
3dc0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
3dd0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
3de0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
3df0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
3e00: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
3e10: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
3e20: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
3e30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
3e40: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
3e50: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
3e60: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
3e70: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
3e80: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
3e90: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
3ea0: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
3eb0: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
3ec0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
3ed0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
3ee0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
3ef0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
3f00: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
3f10: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
3f20: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
3f30: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3f40: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
3f50: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
3f60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3f70: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
3f80: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
3f90: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
3fa0: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
3fb0: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
3fc0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
3fd0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
3fe0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
3ff0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
4000: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
4010: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4020: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4030: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4040: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4050: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4060: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4070: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4080: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4090: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40a0: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
40b0: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
40c0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
40d0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
40e0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
40f0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
4100: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
4110: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4120: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4130: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4140: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4150: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4160: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4170: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4180: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4190: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
41a0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
41b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
41c0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
41d0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
41e0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
41f0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4200: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4210: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4220: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4230: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4240: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4250: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4260: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4270: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4280: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4290: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
42a0: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
42b0: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
42c0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
42d0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
42e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
42f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4300: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4310: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4320: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4330: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4340: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4350: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4360: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4370: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4380: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4390: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
43a0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
43b0: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
43c0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
43d0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
43e0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
43f0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4400: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4410: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4420: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4430: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4440: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4450: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4460: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4470: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4480: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4490: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
44a0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
44b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
44c0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
44d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
44e0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
44f0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
4500: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
4510: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4520: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4530: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4540: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4550: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4560: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4570: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4580: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4590: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
45a0: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
45b0: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
45c0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
45d0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
45e0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
45f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
4600: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
4610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4620: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4630: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4640: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4660: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4670: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4680: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4690: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
46a0: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
46b0: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
46c0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
46d0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
46e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
46f0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4700: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4710: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4720: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4730: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4740: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4750: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4760: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4770: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4780: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4790: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
47a0: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
47b0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
47c0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
47d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
47e0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
47f0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4800: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4810: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4820: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4830: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4840: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4870: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4880: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4890: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
48a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
48b0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
48c0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
48d0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
48e0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
48f0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4900: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4910: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4920: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4930: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4940: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4950: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4960: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4970: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4980: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4990: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
49a0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
49b0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
49c0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
49d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
49e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
49f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
4a00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
4a10: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
4a20: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
4a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
4a40: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
4a50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
4a60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
4a70: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4a80: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
4a90: 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29  ur, &pCur->nKey)
4aa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
4ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a  SQLITE_OK );  /*
4ac0: 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f   KeySize() canno
4ad0: 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  t fail */..  /* 
4ae0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
4af0: 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  tKey table, then
4b00: 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20   the above call 
4b10: 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28  to BtreeKeySize(
4b20: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
4b30: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e  e integer key in
4b40: 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20   pCur->nKey. In 
4b50: 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76  this case this v
4b60: 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c  alue is.  ** all
4b70: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
4b80: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
4b90: 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65   pCur is not ope
4ba0: 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20  n on an intKey. 
4bb0: 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20   ** table, then 
4bc0: 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72  malloc space for
4bd0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70   and store the p
4be0: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
4bf0: 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74  of key .  ** dat
4c00: 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  a..  */.  if( 0=
4c10: 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
4c20: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
4c30: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c  void *pKey = sql
4c40: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74  ite3Malloc( (int
4c50: 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20  )pCur->nKey );. 
4c60: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
4c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4c80: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
4c90: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
4ca0: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
4cb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4cc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
4cd0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
4ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4d00: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
4d10: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4d20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4d30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
4d40: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
4d50: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
4d60: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
4d70: 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  y );..  if( rc==
4d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4d90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
4da0: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
4db0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
4dc0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
4dd0: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
4de0: 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67       pCur->apPag
4df0: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
4e00: 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
4e10: 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  = -1;.    pCur->
4e20: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
4e30: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
4e40: 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ..  invalidateOv
4e50: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
4e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
4e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
4e80: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
4e90: 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65  ll cursors (exce
4ea0: 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74  pt pExcept) that
4eb0: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20   are open on.** 
4ec0: 74 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20  the table  with 
4ed0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
4ee0: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
4ef0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
4f00: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
4f10: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
4f20: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
4f30: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
4f40: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
4f50: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
4f60: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
4f70: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
4f80: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
4f90: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
4fa0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
4fb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4fc0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
4fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
4fe0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
4ff0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5000: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5010: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5020: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5030: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5040: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5050: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5060: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
5070: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
5080: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5090: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
50a0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
50b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
50c0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
50d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
50e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
50f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5100: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5110: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
5120: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5130: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5140: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
5150: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
5160: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
5170: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5180: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
5190: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
51a0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
51b0: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
51c0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
51d0: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
51e0: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
51f0: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
5200: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
5210: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
5220: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
5230: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
5240: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
5250: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
5260: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
5270: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
5280: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
5290: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
52b0: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
52c0: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
52d0: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
52e0: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
52f0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
5300: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
5310: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
5320: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
5330: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
5340: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
5350: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
5360: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
5370: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
5380: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
5390: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
53a0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
53b0: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
53c0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
53d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
53e0: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
53f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5400: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5410: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
5420: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
5430: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
5440: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
5450: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
5460: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35    char aSpace[15
5470: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
5480: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
5490: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
54a0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
54b0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
54c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
54d0: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
54e0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
54f0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
5500: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
5510: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
5520: 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , pKey,.        
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
5550: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5560: 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
5570: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5580: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
55a0: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
55b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
55c0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
55d0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
55e0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
55f0: 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  );.  if( pKey ){
5600: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5610: 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
5620: 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20  cord(pIdxKey);. 
5630: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5640: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
5650: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
5660: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
5670: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
5680: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
5690: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
56a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
56b0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
56c0: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
56d0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
56e0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
56f0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
5700: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5710: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
5720: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
5730: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
5740: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5750: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
5760: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
5770: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
5780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5790: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
57a0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
57b0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
57c0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
57d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
57e0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
57f0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
5800: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5810: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
5820: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5830: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
5840: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
5850: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
5860: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5870: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
5880: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
5890: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
58a0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
58b0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20  ur->skipNext);. 
58c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
58d0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
58e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
58f0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
5900: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
5910: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5920: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
5930: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
5940: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
5950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5960: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
5970: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5980: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
5990: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
59a0: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
59b0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
59c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59d0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
59e0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
59f0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
5a00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
5a10: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
5a20: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
5a30: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
5a40: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
5a50: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
5a60: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
5a70: 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  are pointing.** 
5a80: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
5a90: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
5aa0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
5ab0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e  utine returns an
5ac0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73   error code if s
5ad0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5ae0: 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74  ong.  The.** int
5af0: 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20  eger *pHasMoved 
5b00: 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66  is set to one if
5b10: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
5b20: 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e  moved and 0 if n
5b30: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
5b40: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
5b50: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
5b60: 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d  pCur, int *pHasM
5b70: 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
5b80: 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
5b90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ba0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
5bb0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5bc0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
5bd0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
5be0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
5bf0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5c00: 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29  r->skipNext!=0 )
5c10: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5c20: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5c30: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5c40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5c50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5c70: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
5c80: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
5c90: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
5ca0: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
5cb0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
5cc0: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
5cd0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
5ce0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
5cf0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
5d00: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
5d10: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  age number..*/.s
5d20: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5d30: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5d40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5d50: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5d60: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5d70: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
5d80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5da0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50  ->mutex) );.  nP
5db0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
5dc0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
5dd0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
5de0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
5df0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5e00: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
5e10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
5e20: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
5e30: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
5e40: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
5e50: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
5e60: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
5e70: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
5e80: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
5e90: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
5ea0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
5eb0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
5ec0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
5ed0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
5ee0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
5ef0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
5f00: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
5f10: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
5f20: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
5f30: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
5f40: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
5f50: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
5f60: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
5f70: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
5f80: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
5f90: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
5fa0: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
5fb0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
5fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
5fd0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
5fe0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
5ff0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6000: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6010: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6020: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
6030: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6040: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
6050: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
6060: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
6070: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
6080: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
6090: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
60a0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
60b0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
60c0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
60d0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
60e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
60f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
6100: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
6110: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
6120: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
6130: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6140: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6150: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
6160: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
6170: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
6180: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
6190: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
61a0: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
61b0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
61c0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
61d0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
61e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
61f0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
6200: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
6210: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6220: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6230: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6240: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
6250: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
6260: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
6270: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
6280: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
6290: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
62a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
62b0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
62c0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
62d0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
62e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
62f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6300: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
6310: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6320: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6330: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
6340: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72  exit;.  }.  pPtr
6350: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6360: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6370: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6380: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6390: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
63a0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
63b0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
63c0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
63d0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
63e0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
63f0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6400: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6410: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6420: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6430: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6450: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6460: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6470: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6480: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
64a0: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
64b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
64c0: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
64d0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
64e0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
64f0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6500: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6510: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6520: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6530: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6540: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6550: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6560: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6570: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6580: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6590: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
65a0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
65b0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
65c0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
65d0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
65e0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
65f0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6600: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6610: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6620: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6630: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6640: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6650: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6660: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6670: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6680: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6690: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
66a0: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
66b0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
66c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
66d0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
66e0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
66f0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6700: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6710: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6720: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6730: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6740: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6750: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6760: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6770: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6780: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6790: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
67a0: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
67b0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
67c0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
67d0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
67e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
67f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6800: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6810: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6820: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6830: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
6840: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
6850: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6860: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
6870: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6880: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
6890: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
68a0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
68b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
68c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
68d0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
68e0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
68f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6900: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
6910: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
6920: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
6930: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
6940: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
6950: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
6960: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
6970: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
6980: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
6990: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
69a0: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
69b0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
69c0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
69d0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
69e0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
69f0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
6a00: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
6a10: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
6a20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6a30: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
6a40: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
6a50: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
6a60: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
6a70: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
6a80: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
6a90: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
6aa0: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
6ab0: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
6ac0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
6ad0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
6ae0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
6af0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
6b00: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
6b10: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
6b20: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
6b30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
6b40: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
6b50: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
6b60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
6b70: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
6b80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6b90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6ba0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6bb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
6bc0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
6bd0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
6be0: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
6bf0: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
6c00: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
6c10: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
6c20: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
6c30: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
6c40: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
6c50: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
6c60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
6c70: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
6c80: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
6c90: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
6ca0: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
6cb0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
6cc0: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
6cd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
6ce0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
6cf0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
6d00: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
6d10: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
6d20: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
6d30: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
6d40: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
6d50: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
6d60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6d70: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
6d80: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
6d90: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
6da0: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
6db0: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
6dc0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6dd0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
6de0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
6df0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
6e00: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
6e10: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
6e20: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
6e30: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
6e40: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
6e50: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
6e60: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
6e70: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
6e80: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
6e90: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
6ea0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
6eb0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ed0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
6ee0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
6ef0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
6f00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6f10: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
6f20: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
6f50: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
6f60: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
6f70: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
6f80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6f90: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
6fa0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
6fb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6fc0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6fd0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6fe0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
6ff0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
7000: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
7010: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
7020: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
7030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7040: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7050: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7060: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7070: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7080: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7090: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
70a0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
70b0: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
70c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
70d0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
70e0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
70f0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
7100: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
7110: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
7120: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
7130: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7140: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7150: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7160: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7170: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7180: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7190: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
71a0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
71b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
71c0: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
71d0: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
71e0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
71f0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
7200: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7210: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7220: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
7230: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7240: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7250: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7260: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7270: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7280: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7290: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
72a0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
72b0: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
72c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
72d0: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
72e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
72f0: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
7300: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
7310: 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e  */.    nSize = n
7320: 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20  Payload + n;.   
7330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7340: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
7350: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
7360: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66  flow = 0;.    if
7370: 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d  ( (nSize & ~3)==
7380: 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 ){.      nSize
7390: 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 4;        /* 
73a0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
73b0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a  e is 4 */.    }.
73c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
73d0: 20 3d 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20   = (u16)nSize;. 
73e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
73f0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7400: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7410: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7420: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7430: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7440: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7450: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7460: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
7470: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
7480: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
7490: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
74a0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
74b0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
74c0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
74d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
74e0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
74f0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7500: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7510: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7520: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7530: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7540: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7550: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7560: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
7570: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
7580: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
7590: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
75a0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
75b0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
75c0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
75d0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
75e0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
75f0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7600: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7610: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7620: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7630: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7640: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7650: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7660: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
7670: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
7680: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
7690: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
76a0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
76b0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
76c0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
76d0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
76e0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
76f0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7710: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7720: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7730: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7740: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7750: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7760: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7770: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7780: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7790: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
77a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77b0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
77c0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
77d0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
77e0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
77f0: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7800: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7810: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7820: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7830: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7840: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7850: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7860: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7870: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7880: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7890: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
78a0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
78b0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
78c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
78d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
78e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
78f0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7910: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7920: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7930: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7940: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7950: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7960: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7970: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7980: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
79a0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
79b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
79c0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
79d0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
79e0: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
79f0: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7a00: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7a10: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7a20: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7a30: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7a40: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7a50: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7a60: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7a70: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7a80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7a90: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7aa0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7ab0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7ac0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7ad0: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7ae0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7af0: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7b00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7b10: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7b20: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7b30: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7b40: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7b50: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7b60: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7b70: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7b80: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7b90: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ba0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7bb0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7bc0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7bd0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7bf0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7c00: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7c10: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7c20: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7c30: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7c40: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7c50: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7c60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7c70: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7c80: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7c90: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7ca0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7cb0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7cc0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
7cd0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
7ce0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
7cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
7d00: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
7d10: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
7d20: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
7d30: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
7d40: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
7d50: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
7d60: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
7d70: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
7d80: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
7d90: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
7da0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
7db0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
7dc0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
7dd0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
7de0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
7df0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
7e00: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
7e10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
7e20: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
7e30: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
7e40: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7e50: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
7e60: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
7e70: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
7e80: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
7e90: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
7ea0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
7eb0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7ec0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
7ed0: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
7ee0: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
7ef0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7f00: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7f10: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
7f20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7f30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7f40: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
7f50: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7f60: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
7f70: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
7f80: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
7f90: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
7fa0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
7fb0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
7fc0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
7fd0: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
7fe0: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
7ff0: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8000: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8010: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8020: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8030: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8040: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8050: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8060: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8070: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
8080: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
8090: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
80a0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
80b0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
80c0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
80d0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
80e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
80f0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8100: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8110: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8120: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8130: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8150: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8160: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
8170: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
8180: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
8190: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
81a0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
81b0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
81c0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
81d0: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
81e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
81f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8200: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8210: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8220: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8230: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8240: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8250: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8260: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
8270: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8280: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8290: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
82a0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
82b0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
82c0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
82d0: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
82e0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
82f0: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8300: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8310: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8320: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8330: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8340: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8350: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8360: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
8370: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8380: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
8390: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
83a0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
83b0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
83c0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
83d0: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
83e0: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
83f0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8400: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8410: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8420: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8430: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8440: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8460: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
8470: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
8480: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
8490: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
84a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
84b0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
84c0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
84e0: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
84f0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8520: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8530: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8560: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
8570: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
8590: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
85a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
85b0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
85c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
85d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
85e0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
85f0: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8610: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8630: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8650: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8660: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
8670: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8680: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
8690: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
86a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
86b0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
86c0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
86d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
86e0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8700: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8710: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8720: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8740: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8750: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8760: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8770: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8780: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8790: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
87a0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
87b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
87c0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
87d0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
87e0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
87f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8800: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8810: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8820: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8830: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8840: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8850: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8860: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8870: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8880: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8890: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
88a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
88b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
88c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
88d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
88e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
88f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8900: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8910: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8920: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8930: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8940: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8950: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8960: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8970: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8980: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8990: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
89a0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
89b0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
89c0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
89d0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
89e0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
89f0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8a00: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8a10: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8a20: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8a30: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8a40: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8a50: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8a60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a70: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8a80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a90: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8aa0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8ab0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ac0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ad0: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8ae0: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8af0: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8b00: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8b10: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8b20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8b30: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8b40: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8b50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8b60: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8b70: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8b80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8b90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ba0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8bb0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8bc0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8bd0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8be0: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8bf0: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8c00: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8c10: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8c20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8c30: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8c40: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8c50: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8c60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8c70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8c80: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8c90: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8ca0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8cb0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8cc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8ce0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
8cf0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
8d00: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
8d10: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
8d20: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8d30: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
8d40: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8d50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8d60: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
8d70: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
8d80: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
8d90: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
8da0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
8db0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
8dc0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
8dd0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8de0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
8df0: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
8e00: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
8e10: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
8e20: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
8e30: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
8e40: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
8e50: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
8e60: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
8e70: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8e80: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8e90: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
8ea0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
8eb0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
8ec0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8ed0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8ee0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8ef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8f00: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
8f10: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
8f20: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
8f30: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
8f40: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
8f50: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8f60: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
8f70: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
8f80: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
8f90: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
8fa0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
8fb0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
8fc0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
8fd0: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
8fe0: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
8ff0: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9000: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9010: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9020: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9030: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9040: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9050: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9060: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
9070: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
9080: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
9090: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
90a0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
90b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
90c0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
90d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
90e0: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
90f0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9100: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9110: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9120: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9130: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9140: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9150: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9160: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
9170: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
9180: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
9190: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
91a0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
91b0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
91c0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
91d0: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
91e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
91f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9200: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9210: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9220: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9230: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9240: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9250: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9260: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9290: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
92a0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
92b0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
92e0: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
92f0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9300: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9310: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9320: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9330: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9340: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9350: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9360: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
9370: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
9380: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
9390: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
93a0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
93b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93c0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93d0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
93f0: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9400: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9410: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9420: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9430: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9440: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9450: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9460: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
9470: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
9480: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
9490: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
94a0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
94b0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
94c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
94d0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
94e0: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
94f0: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9500: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9510: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9520: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9530: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9540: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9550: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9560: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
9570: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9580: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9590: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
95a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
95b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
95c0: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
95d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95e0: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
95f0: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9600: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9610: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9620: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9630: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9640: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
9650: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9660: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9670: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9680: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9690: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
96a0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
96b0: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
96c0: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
96d0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
96e0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
96f0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9700: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9710: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9720: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9730: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9740: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
9750: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
9760: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
9770: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
9780: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
9790: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
97a0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
97b0: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
97c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
97d0: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
97e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
97f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9800: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
9810: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
9820: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
9830: 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20  -4 || pc<addr+4 
9840: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9850: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9860: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
9870: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
9880: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9890: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
98a0: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
98b0: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
98c0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
98d0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
98e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
98f0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
9900: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
9910: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9920: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9930: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9940: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9950: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9960: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9970: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9980: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
99a0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
99b0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
99c0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
99d0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
99e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
99f0: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
9a00: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
9a10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9a20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9a30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9a40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9a50: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
9a60: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9a70: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9a80: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9a90: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9aa0: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9ab0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9ac0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9ad0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9ae0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9af0: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9b00: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9b10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9b30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
9b40: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
9b50: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
9b60: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9b70: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9b80: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9b90: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9ba0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9bb0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9bc0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9bd0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
9bf0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
9c00: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
9c10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9c20: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9c30: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c40: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
9c50: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
9c60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
9c70: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
9c80: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
9c90: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
9ca0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
9cb0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9cc0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
9cd0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
9ce0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
9cf0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
9d00: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
9d10: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
9d20: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
9d30: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
9d40: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
9d50: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
9d60: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
9d70: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
9d80: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
9d90: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
9da0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
9db0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
9dc0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
9dd0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
9de0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
9df0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67  op+nByte <= pPag
9e00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9e10: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
9e20: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
9e30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9e40: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
9e50: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
9e60: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
9e70: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
9e80: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
9e90: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
9ea0: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
9eb0: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
9ec0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
9ed0: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
9ee0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
9ef0: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
9f00: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
9f10: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
9f20: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
9f30: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
9f40: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
9f50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9f60: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
9f70: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
9f80: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
9f90: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
9fa0: 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69  in, hdr;.  int i
9fb0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fd0: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
9fe0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
9ff0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
a000: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
a010: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
a020: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a030: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a040: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a050: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a060: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a070: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
a080: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
a090: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a0a0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a0b0: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c   (start + size)<
a0c0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
a0d0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
a0e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a0f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a100: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a110: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
a120: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
a130: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
a140: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  /..  if( pPage->
a150: 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
a160: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  e ){.    /* Over
a170: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
a180: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
a190: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
a1a0: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20  cure_delete.    
a1b0: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
a1c0: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  bled */.    mems
a1d0: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
a1e0: 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a   0, size);.  }..
a1f0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
a200: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
a210: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a220: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74  freeblocks.  Not
a230: 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e  e that.  ** even
a240: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
a250: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
a260: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
a270: 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20  nitPage(),.  ** 
a280: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a290: 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  did not detect o
a2a0: 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73  verlapping cells
a2b0: 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f   or.  ** freeblo
a2c0: 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70  cks that overlap
a2d0: 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72  ped cells.   Nor
a2e0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
a2f0: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65  when the.  ** ce
a300: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
a310: 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75  exceeds the valu
a320: 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  e in the page he
a330: 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a  ader.  If these.
a340: 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20    ** situations 
a350: 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73  arise, then subs
a360: 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70  equent insert op
a370: 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63  erations might c
a380: 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20  orrupt.  ** the 
a390: 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65  freelist.  So we
a3a0: 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   do need to chec
a3b0: 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e  k for corruption
a3c0: 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a   while scanning.
a3d0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a3e0: 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  t..  */.  hdr = 
a3f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a400: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
a410: 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50   1;.  iLast = pP
a420: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a430: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65  Size - 4;.  asse
a440: 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74  rt( start<=iLast
a450: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   );.  while( (pb
a460: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a470: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
a480: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
a490: 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  ){.    if( pbegi
a4a0: 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  n<addr+4 ){.    
a4b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a4d0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
a4e0: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  begin;.  }.  if(
a4f0: 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b   pbegin>iLast ){
a500: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a510: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
a530: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
a540: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
a550: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a560: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
a570: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a580: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
a590: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
a5a0: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
a5b0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
a5c0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28  pPage->nFree + (
a5d0: 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  u16)size;..  /* 
a5e0: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
a5f0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
a600: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a610: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
a620: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a630: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
a640: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
a650: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
a660: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
a670: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
a680: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
a690: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a6a0: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
a6b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a6c0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
a6d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a6e0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
a6f0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
a700: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
a710: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
a720: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
a730: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
a740: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
a750: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
a760: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
a770: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
a780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a790: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
a7c0: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
a7d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a7e0: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
a7f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a800: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
a810: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
a820: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a830: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
a840: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
a850: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
a860: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
a870: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
a880: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
a890: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
a8a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
a8b0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
a8c0: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
a8d0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
a8e0: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
a8f0: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
a900: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
a910: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
a920: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
a930: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a940: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
a950: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
a960: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
a970: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a980: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a990: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
a9a0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a9c0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a9d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
a9e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a9f0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
aa00: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
aa10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
aa20: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
aa30: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
aa40: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
aa50: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aa60: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
aa70: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
aa80: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
aa90: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
aaa0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
aab0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
aac0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
aad0: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
aae0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
aaf0: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
ab00: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
ab10: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
ab20: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
ab30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ab40: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
ab50: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
ab60: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ab70: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
ab80: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
ab90: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
aba0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
abb0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
abc0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
abd0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
abe0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
abf0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
ac00: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
ac10: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
ac20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
ac30: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
ac40: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
ac50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ac60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ac70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ac80: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
ac90: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
aca0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
acb0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
acc0: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
acd0: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
ace0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
acf0: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
ad00: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
ad10: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
ad20: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
ad30: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
ad40: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
ad50: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
ad60: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
ad70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
ad80: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
ad90: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
ada0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
adb0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
adc0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
add0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
ade0: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
adf0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
ae00: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
ae10: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
ae20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
ae30: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
ae40: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
ae50: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
ae60: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
ae70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ae80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ae90: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
aea0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
aeb0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
aec0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
aed0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
aee0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
aef0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
af00: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
af10: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
af20: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
af30: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
af40: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
af50: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
af60: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
af70: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
af80: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
af90: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
afa0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
afb0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
afc0: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
afd0: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
afe0: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
aff0: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
b000: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b010: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d   btreeInitPage(M
b020: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
b030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b040: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b050: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b060: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b070: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b080: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b090: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
b0a0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
b0b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b0c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
b0d0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b0e0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
b0f0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b100: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
b110: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
b120: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
b130: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
b140: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
b150: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
b160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b170: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
b180: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
b190: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
b1a0: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
b1b0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b1c0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
b1d0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b1e0: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
b1f0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
b200: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
b210: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
b220: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
b230: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
b240: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
b250: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
b260: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
b270: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
b280: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
b290: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
b2a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
b2b0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
b2c0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
b2d0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
b2e0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
b2f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
b300: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
b310: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
b320: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
b330: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
b340: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b350: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
b360: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
b370: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b380: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b390: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b3a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
b3b0: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
b3c0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
b3d0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
b3e0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
b3f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
b400: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
b410: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
b420: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b430: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
b440: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
b450: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
b460: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b470: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
b480: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
b490: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
b4a0: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
b4b0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
b4c0: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
b4d0: 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67  ze - 1;.    pPag
b4e0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b4f0: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b500: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b510: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b520: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b530: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b540: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b550: 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  f;.    top = get
b560: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b570: 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  5]);.    pPage->
b580: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
b590: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
b5a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
b5b0: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
b5c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
b5d0: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
b5e0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
b5f0: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
b600: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
b610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b620: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b630: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
b640: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
b650: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
b660: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
b670: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
b680: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
b690: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
b6a0: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
b6b0: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
b6c0: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
b6d0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
b6e0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
b6f0: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
b700: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
b710: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
b720: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
b730: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
b740: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
b750: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
b760: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
b770: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
b780: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
b790: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
b7a0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
b7b0: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
b7c0: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
b7d0: 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  - 4;.#if defined
b7e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
b7f0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
b800: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
b810: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b820: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
b830: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b840: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
b850: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
b860: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
b870: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
b880: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
b890: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
b8a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b8b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
b8c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
b8d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
b8e0: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
b8f0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b900: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
b910: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
b920: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b930: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
b940: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b950: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b960: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
b970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b980: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b990: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
b9a0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
b9b0: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
b9c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b9d0: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
b9e0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
b9f0: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
ba00: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
ba10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba20: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ba30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ba40: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
ba50: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
ba60: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65  st++;.    }  .#e
ba70: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ndif..    /* Com
ba80: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
ba90: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
baa0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
bab0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bac0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
bad0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
bae0: 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69  ] + top;.    whi
baf0: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
bb00: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
bb10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
bb20: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
bb30: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
bb40: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
bb50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   free block is o
bb60: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
bb70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bb80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bb90: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bba0: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
bbb0: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
bbc0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bbd0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
bbe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78  ;.      if( (nex
bbf0: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
bc00: 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69  size+3) || pc+si
bc10: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
bc20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
bc30: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
bc40: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
bc50: 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74  er. And the last
bc60: 20 62 79 74 65 20 6f 66 0a 09 2a 2a 20 74 68 65   byte of..** the
bc70: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
bc80: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
bc90: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
bca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bcb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bcc0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bcd0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
bce0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
bcf0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
bd00: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
bd10: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
bd20: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
bd30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
bd40: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
bd50: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
bd60: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
bd70: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
bd80: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
bd90: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
bda0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
bdb0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
bdc0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
bdd0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
bde0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
bdf0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
be00: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
be10: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
be20: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
be30: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
be40: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
be50: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
be60: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
be70: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
be80: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
be90: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
beb0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
bec0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
bed0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bee0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
bef0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
bf00: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
bf10: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
bf20: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
bf30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
bf40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bf50: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
bf60: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
bf70: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
bf80: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
bf90: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
bfa0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
bfb0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
bfc0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
bfd0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
bfe0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
bff0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c000: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c010: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
c020: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c030: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
c040: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
c050: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c060: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c070: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
c080: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c090: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c0a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c0b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c0c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
c0d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c0e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
c0f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
c100: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c110: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c120: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c130: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c140: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c150: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c160: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65  );.  if( pBt->se
c170: 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
c180: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c190: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
c1a0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
c1b0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
c1c0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
c1d0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
c1e0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
c1f0: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
c200: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c210: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
c220: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c230: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c240: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
c250: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
c260: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
c270: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c280: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
c290: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
c2a0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
c2b0: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
c2c0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c2d0: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
c2e0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
c2f0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
c300: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
c310: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
c320: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
c330: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
c340: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
c350: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c360: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
c370: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
c380: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
c390: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
c3a0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
c3b0: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
c3c0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
c3d0: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
c3e0: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
c3f0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
c400: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
c410: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
c420: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
c430: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
c440: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
c450: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
c460: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c470: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
c480: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
c490: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c4a0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
c4b0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
c4c0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
c4d0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
c4e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c4f0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
c500: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
c510: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
c520: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c530: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
c540: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
c550: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
c560: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
c570: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
c580: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
c590: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
c5a0: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
c5b0: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
c5c0: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
c5d0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
c5e0: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
c5f0: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
c600: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
c610: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
c620: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
c630: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
c640: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
c650: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
c660: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
c670: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
c680: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
c690: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
c6a0: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
c6b0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
c6c0: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
c6d0: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
c6e0: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
c6f0: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
c700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c710: 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
c720: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
c730: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
c740: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c750: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c760: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c770: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
c780: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
c790: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
c7a0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
c7b0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
c7c0: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
c7d0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
c7e0: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
c7f0: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
c800: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
c810: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
c820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c840: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
c850: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
c860: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
c870: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
c880: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
c890: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
c8a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
c8b0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
c8c0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
c8d0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
c8e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c8f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
c900: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
c910: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
c920: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
c930: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
c940: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
c950: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
c960: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
c970: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c980: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c990: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c9a0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
c9c0: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
c9d0: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
c9e0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
c9f0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
ca00: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ca10: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ca20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
ca30: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
ca40: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
ca50: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
ca60: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
ca70: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
ca80: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
ca90: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
caa0: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
cab0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
cac0: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
cad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cae0: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
caf0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
cb00: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
cb10: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
cb20: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
cb30: 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
cb40: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
cb50: 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
cb60: 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
cb70: 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
cb80: 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
cb90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
cba0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
cbb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
cbc0: 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
cbd0: 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
cbe0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
cbf0: 69 6e 74 29 62 74 72 65 65 50 61 67 65 63 6f 75  int)btreePagecou
cc00: 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
cc10: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
cc20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
cc30: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
cc40: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
cc50: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
cc60: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
cc70: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
cc80: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
cc90: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
cca0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
ccb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ccc0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
ccd0: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
cce0: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
ccf0: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
cd00: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
cd10: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
cd20: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
cd30: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
cd40: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
cd50: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
cd60: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
cd70: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
cd80: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
cd90: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
cda0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cdb0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
cdc0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cdd0: 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72  ppPage     /* Wr
cde0: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
cdf0: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  nter here */.){.
ce00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
ce10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ce20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ce30: 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  x) );..  if( pgn
ce40: 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
ce50: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
ce60: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
ce70: 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
ce80: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
ce90: 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
cea0: 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
ceb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cec0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
ced0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a   btreeInitPage(*
cee0: 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  ppPage);.      i
cef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cf00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
cf10: 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
cf20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cf30: 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28    }..  testcase(
cf40: 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
cf50: 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
cf60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
cf70: 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
cf80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
cf90: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
cfa0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
cfb0: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
cfc0: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
cfd0: 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
cfe0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
cff0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
d000: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
d010: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
d020: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d030: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
d040: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
d050: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
d060: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
d070: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
d080: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
d090: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73  pPage );.    ass
d0a0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d0b0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
d0c0: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
d0d0: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
d0e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d0f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d100: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d110: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
d120: 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
d130: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
d140: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
d150: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
d160: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
d170: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
d180: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
d190: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
d1a0: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
d1b0: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
d1c0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
d1d0: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
d1e0: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
d1f0: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
d200: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d210: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
d220: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
d230: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
d240: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
d250: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
d260: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
d270: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
d280: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
d290: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
d2a0: 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
d2b0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
d2c0: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
d2d0: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
d2e0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
d2f0: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
d300: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
d310: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
d320: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
d330: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
d340: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d350: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d360: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d370: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
d380: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
d390: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
d3a0: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
d3b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
d3c0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
d3d0: 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
d3e0: 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
d3f0: 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
d400: 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
d410: 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
d420: 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
d430: 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
d440: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
d450: 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
d460: 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
d470: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d480: 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
d490: 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
d4a0: 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
d4b0: 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
d4c0: 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
d4d0: 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
d4e0: 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
d4f0: 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
d500: 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
d510: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
d520: 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
d530: 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
d540: 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
d550: 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
d560: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
d570: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
d580: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
d590: 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
d5a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d5b0: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
d5c0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
d5d0: 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
d5e0: 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
d5f0: 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
d600: 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
d610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d620: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
d630: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
d640: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
d650: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
d660: 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
d670: 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
d680: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
d690: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
d6a0: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
d6b0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
d6c0: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
d6d0: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
d6e0: 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  * a new database
d6f0: 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e   with a random n
d700: 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ame is created. 
d710: 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e   This randomly n
d720: 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  amed.** database
d730: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
d740: 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74  leted when sqlit
d750: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
d760: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20  s called..** If 
d770: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
d780: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
d790: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
d7a0: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
d7b0: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
d7c0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
d7d0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
d7e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
d7f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
d800: 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
d810: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
d820: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
d830: 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
d840: 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
d850: 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
d860: 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
d870: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
d880: 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
d890: 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
d8a0: 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
d8b0: 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
d8c0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
d8d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
d8e0: 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
d8f0: 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
d900: 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
d910: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
d920: 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f  3BtreeOpen(.  co
d930: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
d940: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
d950: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
d960: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
d970: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
d980: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
d990: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
d9a0: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
d9b0: 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
d9c0: 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
d9d0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
d9e0: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
d9f0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
da00: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
da10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
da20: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
da30: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
da40: 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
da50: 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
da60: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
da70: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
da80: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
da90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
daa0: 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
dab0: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53  s btree */.  BtS
dac0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dae0: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
daf0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
db00: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
db30: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
db40: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
db50: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
db60: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
db70: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
db80: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
db90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
dbb0: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
dbc0: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
dbd0: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbf0: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
dc00: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
dc10: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
dc20: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
dc30: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
dc40: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
dc50: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20  nt */..  /* Set 
dc60: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
dc70: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
dc80: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
dc90: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
dca0: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
dcb0: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
dcc0: 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  . This symbol is
dcd0: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
dce0: 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66  f.  ** either of
dcf0: 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61   the shared-data
dd00: 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66   or autovacuum f
dd10: 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70  eatures are comp
dd20: 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20  iled .  ** into 
dd30: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a  the library..  *
dd40: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
dd50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
dd60: 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66  D_CACHE) || !def
dd70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
dd80: 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23  _AUTOVACUUM).  #
dd90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
dda0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63  T_MEMORYDB.    c
ddb0: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
ddc0: 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20   = 0;.  #else.  
ddd0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
dde0: 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20  mdb = zFilename 
ddf0: 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65  && !strcmp(zFile
de00: 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
de10: 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64  );.  #endif.#end
de20: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
de30: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
de40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
de50: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
de60: 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e  ;..  pVfs = db->
de70: 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69  pVfs;.  p = sqli
de80: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
de90: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
dea0: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
deb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
dec0: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
ded0: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
dee0: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
def0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
df00: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
df10: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
df20: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
df30: 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
df40: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
df50: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
df60: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
df70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
df80: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
df90: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
dfa0: 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
dfb0: 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
dfc0: 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
dfd0: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
dfe0: 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
dff0: 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
e000: 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
e010: 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26  if( isMemdb==0 &
e020: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  & zFilename && z
e030: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
e040: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
e050: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
e060: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
e070: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
e080: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
e090: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
e0a0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
e0b0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
e0c0: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
e0d0: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
e0e0: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
e0f0: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e  hared;.      p->
e100: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
e110: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
e120: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
e130: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e140: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
e150: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
e170: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
e180: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
e190: 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61  ame, nFullPathna
e1a0: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
e1b0: 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 4f  e);.      mutexO
e1c0: 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  pen = sqlite3Mut
e1d0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
e1e0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e  UTEX_STATIC_OPEN
e1f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e200: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
e210: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d  exOpen);.      m
e220: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
e230: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
e240: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
e250: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
e260: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e270: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
e280: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42  d);.      for(pB
e290: 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
e2a0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
e2b0: 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
e2c0: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
e2d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e2e0: 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
e2f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
e300: 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
e310: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
e320: 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
e330: 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
e340: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
e350: 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
e360: 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
e370: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
e380: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
e390: 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
e3a0: 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
e3b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
e3c0: 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
e3d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
e3e0: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
e3f0: 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
e400: 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
e410: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
e420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e430: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
e440: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
e450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e460: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
e470: 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
e480: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e490: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e4a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
e4b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
e4d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
e4e0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
e4f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e500: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
e510: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
e520: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
e530: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
e540: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e550: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e560: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
e570: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
e580: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e590: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e5a0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
e5b0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
e5c0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
e5d0: 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
e5e0: 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
e5f0: 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
e600: 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
e610: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
e620: 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
e630: 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
e640: 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
e650: 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
e660: 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
e670: 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
e680: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
e690: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
e6a0: 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
e6b0: 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
e6c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
e6d0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
e6e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
e6f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
e700: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
e710: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
e720: 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
e730: 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
e740: 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
e750: 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
e760: 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
e770: 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
e780: 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
e790: 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
e7a0: 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
e7b0: 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
e7c0: 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
e7d0: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
e7e0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
e7f0: 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
e800: 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
e810: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
e820: 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (u64)==8 || size
e830: 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(u64)==4 );.  
e840: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
e850: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
e860: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
e870: 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
e880: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
e890: 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
e8a0: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
e8b0: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
e8c0: 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
e8d0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
e8e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
e8f0: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  EM;.      goto b
e900: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
e910: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
e920: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
e930: 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
e940: 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
e970: 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
e980: 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
e990: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
e9a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e9b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e9c0: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
e9d0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
e9e0: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
e9f0: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
ea00: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ea10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ea20: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
ea30: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
ea40: 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
ea50: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
ea60: 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
ea70: 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
ea80: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
ea90: 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
eaa0: 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
eab0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
eac0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
ead0: 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  1 = 0;.    pBt->
eae0: 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74  readOnly = sqlit
eaf0: 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
eb00: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  y(pBt->pPager);.
eb10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
eb20: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
eb30: 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
eb40: 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 1;.#endif.  
eb50: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
eb60: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
eb70: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
eb80: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
eb90: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
eba0: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
ebb0: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
ebc0: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
ebd0: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
ebe0: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
ebf0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
ec00: 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
ec10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ec20: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
ec30: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
ec40: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
ec50: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
ec60: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
ec70: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
ec80: 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
ec90: 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
eca0: 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
ecb0: 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
ecc0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
ecd0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
ece0: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
ecf0: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
ed00: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
ed10: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
ed20: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
ed30: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
ed40: 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
ed50: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
ed60: 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
ed70: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
ed80: 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
ed90: 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
eda0: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
edb0: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
edc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
edd0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
ede0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
edf0: 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
ee00: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
ee10: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
ee20: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
ee30: 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
ee40: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
ee50: 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
ee60: 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
ee70: 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  e{.      nReserv
ee80: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
ee90: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
eea0: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
eeb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eec0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
eed0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
eee0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
eef0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
ef00: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
ef10: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
ef20: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
ef30: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
ef40: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
ef50: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  if.    }.    rc 
ef60: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
ef70: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
ef80: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
ef90: 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
efa0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
efb0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
efc0: 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ut;.    pBt->usa
efd0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
efe0: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
eff0: 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
f000: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
f010: 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
f020: 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
f030: 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
f040: 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
f050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
f060: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
f070: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f080: 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20  _DISKIO).    /* 
f090: 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68  Add the new BtSh
f0a0: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74  ared object to t
f0b0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
f0c0: 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64  harable BtShared
f0d0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
f0e0: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
f0f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
f100: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
f110: 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52  d;.      pBt->nR
f120: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75  ef = 1;.      mu
f130: 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
f140: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
f150: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
f160: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
f170: 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
f180: 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
f190: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
f1a0: 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
f1b0: 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
f1c0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f1d0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f1e0: 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
f1f0: 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
f200: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f210: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
f220: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  .          db->m
f230: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
f240: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f250: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
f260: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f270: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
f280: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
f290: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
f2a0: 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
f2b0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
f2c0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
f2d0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
f2e0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
f2f0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
f300: 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
f310: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f320: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
f330: 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
f340: 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
f350: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f360: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
f370: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f380: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
f390: 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
f3a0: 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
f3b0: 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
f3c0: 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
f3d0: 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
f3e0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
f3f0: 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
f400: 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
f410: 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
f420: 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
f430: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
f440: 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
f450: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
f460: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
f470: 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
f480: 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
f490: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
f4a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
f4b0: 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
f4c0: 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
f4d0: 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
f4e0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
f4f0: 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
f500: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
f510: 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
f520: 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42   p->pBt<pSib->pB
f530: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
f540: 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
f550: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
f560: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
f570: 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
f580: 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
f590: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
f5a0: 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
f5b0: 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  & pSib->pNext->p
f5c0: 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  Bt<p->pBt ){.   
f5d0: 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
f5e0: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
f5f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f600: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
f610: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
f620: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
f630: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
f640: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
f650: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
f660: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
f670: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f680: 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
f690: 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
f6a0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
f6b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f6c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
f6d0: 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
f6e0: 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
f6f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f700: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
f710: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
f720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
f730: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
f740: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
f750: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
f760: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f770: 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
f780: 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tree = 0;.  }.  
f790: 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
f7a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
f7b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f7c0: 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
f7d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f7e0: 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
f7f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
f800: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
f810: 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
f820: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
f830: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
f840: 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
f850: 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
f860: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
f870: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
f880: 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
f890: 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
f8a0: 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
f8b0: 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
f8c0: 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
f8d0: 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
f8e0: 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
f8f0: 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
f900: 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
f910: 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
f920: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f930: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71  HARED_CACHE.  sq
f940: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
f950: 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64  ster;.  BtShared
f960: 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
f970: 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
f980: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f990: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
f9a0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d  ->mutex) );.  pM
f9b0: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
f9c0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
f9d0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
f9e0: 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33  STER);.  sqlite3
f9f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
fa00: 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
fa10: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
fa20: 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
fa30: 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
fa40: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
fa50: 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
fa60: 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
fa70: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
fa80: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
fa90: 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
faa0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fab0: 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
fac0: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
fad0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
fae0: 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
faf0: 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
fb00: 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
fb10: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
fb20: 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
fb30: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
fb40: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
fb50: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
fb60: 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
fb70: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
fb80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
fb90: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
fba0: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
fbb0: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
fbc0: 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
fbd0: 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
fbe0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
fbf0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
fc00: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
fc10: 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
fc20: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
fc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
fc40: 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
fc50: 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
fc60: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
fc70: 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
fc80: 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  Bt) bytes..*/.st
fc90: 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
fca0: 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
fcb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
fcc0: 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
fcd0: 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
fce0: 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
fcf0: 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
fd00: 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
fd10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
fd20: 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
fd30: 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
fd40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
fd50: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
fd60: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
fd70: 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42  ite3PageFree( pB
fd80: 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
fd90: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
fda0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
fdb0: 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
fdc0: 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
fdd0: 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
fde0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
fdf0: 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
fe00: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
fe10: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
fe20: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
fe30: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
fe40: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
fe50: 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
fe60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
fe70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
fe80: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
fe90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
fea0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
feb0: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
fec0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
fed0: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
fee0: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
fef0: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
ff00: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
ff10: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
ff20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ff30: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
ff40: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
ff50: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
ff60: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
ff70: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
ff80: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
ff90: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
ffa0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
ffb0: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
ffc0: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
ffd0: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
ffe0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
fff0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
10000 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
10010 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10020 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
10030 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
10040 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
10050 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
10060 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
10070 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
10080 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
10090 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
100a0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
100b0 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
100c0 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
100d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
100e0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
100f0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
10100 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
10110 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
10120 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
10130 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
10140 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
10150 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
10160 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
10170 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
10180 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
10190 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
101a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
101b0 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
101c0 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
101d0 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
101e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
101f0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
10200 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
10210 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
10220 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
10230 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
10240 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
10250 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
10260 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
10270 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
10280 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
10290 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
102a0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
102b0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
102c0 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
102d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
102e0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
102f0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
10300 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
10310 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
10320 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
10330 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
10340 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
10350 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
10360 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
10370 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
10380 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
10390 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
103a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
103b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
103c0 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
103d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
103e0 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
103f0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
10400 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
10410 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
10420 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
10430 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
10440 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
10450 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
10460 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
10470 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
10480 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
10490 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
104a0 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
104b0 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
104c0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
104d0 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
104e0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
104f0 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
10500 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
10510 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
10520 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
10530 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
10540 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
10550 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
10560 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
10570 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
10580 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
10590 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
105a0 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
105b0 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
105c0 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
105d0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
105e0 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
105f0 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
10600 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
10610 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
10620 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
10630 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
10640 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
10650 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
10660 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
10670 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
10680 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
10690 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
106a0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
106b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
106c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
106d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
106e0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
106f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10700 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
10710 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
10720 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
10730 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
10740 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
10750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
10770 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
10780 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
10790 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
107a0 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
107b0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
107c0 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
107d0 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
107e0 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
107f0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
10800 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
10810 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
10820 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
10830 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
10840 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
10850 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
10860 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
10870 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
10880 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
10890 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
108a0 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
108b0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
108c0 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
108d0 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
108e0 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
108f0 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
10900 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
10910 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
10920 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10930 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
10940 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
10950 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
10960 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
10970 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
10980 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
10990 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
109a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
109b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
109c0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
109d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
109e0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
109f0 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
10a00 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
10a10 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
10a20 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
10a30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10a50 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10a60 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
10a70 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
10a80 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
10a90 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
10aa0 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
10ab0 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
10ac0 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
10ad0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
10ae0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10af0 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
10b00 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
10b10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10b20 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
10b30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10b40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
10b50 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
10b60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10b70 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
10b80 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
10b90 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
10ba0 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
10bb0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10bd0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
10be0 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
10bf0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10c00 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
10c10 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
10c20 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
10c30 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10c40 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
10c50 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
10c60 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
10c70 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
10c80 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
10c90 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
10ca0 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
10cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
10cc0 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
10cd0 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
10ce0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
10cf0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
10d00 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
10d10 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
10d20 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
10d30 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
10d40 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
10d50 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
10d60 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
10d70 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
10d80 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
10d90 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
10da0 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
10db0 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
10dc0 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
10dd0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
10de0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
10df0 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
10e00 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
10e10 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
10e20 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
10e30 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
10e40 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
10e50 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
10e60 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
10e70 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
10e80 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
10e90 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
10ea0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
10eb0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
10ec0 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
10ed0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
10ee0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
10ef0 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
10f00 20 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78   the pageSizeFix
10f10 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ed flag is set s
10f20 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
10f30 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
10f40 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
10f50 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
10f60 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
10f70 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
10f80 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
10f90 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
10fa0 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
10fb0 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
10fc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
10fd0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
10fe0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
10ff0 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
11000 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
11010 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11020 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
11030 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
11040 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
11050 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11070 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
11080 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
11090 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
110a0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
110b0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
110c0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
110d0 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
110e0 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
110f0 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
11100 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
11110 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
11120 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
11130 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
11140 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
11150 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
11160 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
11170 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
11180 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
11190 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
111a0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
111b0 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
111c0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
111d0 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
111e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
111f0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
11200 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
11210 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
11220 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
11230 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
11240 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
11250 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
11260 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  x ) pBt->pageSiz
11270 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71  eFixed = 1;.  sq
11280 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11290 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
112a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
112b0 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
112c0 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
112d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
112e0 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
112f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
11300 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
11310 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Size;.}../*.** R
11320 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
11330 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
11340 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
11350 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
11360 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
11370 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
11380 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
11390 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
113a0 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
113b0 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
113c0 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  nsions..*/.int s
113d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
113e0 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
113f0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
11400 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11410 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
11420 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
11430 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
11440 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11450 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11460 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
11470 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
11480 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
11490 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
114a0 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
114b0 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
114c0 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
114d0 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
114e0 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
114f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
11500 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
11510 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
11520 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
11530 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
11540 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
11550 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
11560 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
11570 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
11580 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
11590 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
115a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
115b0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
115c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
115d0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
115e0 2a 20 53 65 74 20 74 68 65 20 73 65 63 75 72 65  * Set the secure
115f0 44 65 6c 65 74 65 20 66 6c 61 67 20 69 66 20 6e  Delete flag if n
11600 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
11610 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
11620 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
11630 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
11640 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
11650 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65   value of the se
11660 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20 73 65  cureDelete.** se
11670 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
11680 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
11690 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
116a0 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
116b0 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
116c0 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
116d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
116e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
116f0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
11700 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
11710 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65  p->pBt->secureDe
11720 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c 61 67 21  lete = (newFlag!
11730 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d  =0) ? 1 : 0;.  }
11740 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74 2d 3e   .  b = p->pBt->
11750 73 65 63 75 72 65 44 65 6c 65 74 65 3b 0a 20 20  secureDelete;.  
11760 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11770 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
11780 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
11790 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
117a0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
117b0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
117c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
117d0 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
117e0 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
117f0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
11800 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
11810 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
11820 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
11830 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
11840 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
11850 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
11860 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
11870 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
11880 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
11890 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
118a0 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
118b0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
118c0 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
118d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
118e0 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
118f0 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
11900 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
11910 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
11920 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
11930 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
11940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
11950 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
11960 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11970 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11980 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11990 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
119a0 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
119b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
119c0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
119d0 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76  SizeFixed && (av
119e0 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
119f0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
11a00 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
11a10 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
11a20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
11a30 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
11a40 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
11a50 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
11a60 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
11a70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11a80 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
11a90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11aa0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11ab0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
11ac0 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
11ad0 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
11ae0 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
11af0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
11b00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11b10 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
11b20 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
11b30 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
11b40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
11b50 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
11b60 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
11b70 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
11b80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11b90 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
11ba0 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
11bb0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
11bc0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
11bd0 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
11be0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
11bf0 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
11c00 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
11c10 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
11c20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11c30 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11c40 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
11c50 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
11c60 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
11c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11c80 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
11c90 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
11ca0 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
11cb0 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
11cc0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
11cd0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
11ce0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
11cf0 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
11d00 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
11d10 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
11d20 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
11d30 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
11d40 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
11d50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
11d60 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
11d70 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
11d80 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
11d90 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
11da0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
11db0 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
11dc0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
11dd0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11de0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
11df0 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
11e00 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
11e10 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
11e20 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
11e30 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
11e40 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
11e50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11e60 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
11e70 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
11e80 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
11e90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
11ea0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
11eb0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
11ec0 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  nt nPageHeader; 
11ed0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11ee0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
11ef0 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
11f00 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
11f10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11f20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11f30 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11f40 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
11f50 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
11f60 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
11f70 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
11f80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11f90 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
11fa0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
11fb0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
11fc0 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
11fd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11fe0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
11ff0 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
12000 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
12010 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
12020 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
12030 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
12040 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
12050 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
12060 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
12070 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
12080 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 28  >aData);.  if( (
12090 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
120a0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
120b0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
120c0 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  le))!=SQLITE_OK 
120d0 29 7b 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67  ){;.    goto pag
120e0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
120f0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3d    }.  if( nPage=
12100 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b  =0 || memcmp(24+
12110 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
12120 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67  ta, 92+(u8*)pPag
12130 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20  e1->aData,4)!=0 
12140 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
12150 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20  PageFile;.  }.  
12160 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
12170 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b     int pageSize;
12180 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
12190 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
121a0 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
121b0 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
121c0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
121d0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
121e0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
121f0 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
12200 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12210 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
12220 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12230 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
12240 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
12250 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
12260 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
12270 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
12280 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
12290 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
122a0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
122b0 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
122c0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72   ){.      pBt->r
122d0 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadOnly = 1;.   
122e0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
122f0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
12300 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12310 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
12320 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
12330 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
12340 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
12350 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
12360 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
12370 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
12380 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
12390 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
123a0 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
123b0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
123c0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
123d0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
123e0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
123f0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
12400 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
12410 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
12420 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
12430 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
12440 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
12450 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
12460 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
12470 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
12480 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
12490 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
124a0 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
124b0 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
124c0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
124d0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
124e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
124f0 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d 3e  [19]==2 && pBt->
12500 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20 29  doNotUseWAL==0 )
12510 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
12520 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
12530 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
12540 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
12550 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
12560 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12580 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12590 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
125a0 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d  else if( isOpen=
125b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
125c0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
125d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
125e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
125f0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
12600 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
12610 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
12620 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
12630 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
12640 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  n must be exactl
12650 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20  y 25%.  And the 
12660 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65  minimum.    ** e
12670 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
12680 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66   must be 12.5% f
12690 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74  or both leaf-dat
126a0 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64  a and non-leaf-d
126b0 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ata..    ** The 
126c0 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
126d0 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
126e0 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
126f0 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
12700 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
12710 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
12720 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
12730 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
12740 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
12750 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
12760 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
12770 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
12780 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
12790 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
127a0 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20  e(&page1[16]);. 
127b0 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
127c0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
127d0 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31  0 || pageSize<51
127e0 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51  2 ||.        (SQ
127f0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
12800 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65  ZE<32768 && page
12810 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
12820 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29  PAGE_SIZE).    )
12830 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
12840 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
12850 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
12860 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
12870 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
12880 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
12890 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
128a0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d    if( pageSize!=
128b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
128c0 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
128d0 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
128e0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
128f0 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
12900 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
12910 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
12920 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
12930 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
12940 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
12950 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
12960 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
12970 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
12980 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
12990 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
129a0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
129b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
129c0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
129d0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
129e0 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
129f0 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
12a00 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
12a10 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
12a20 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
12a30 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
12a40 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
12a50 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
12a60 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
12a70 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
12a80 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
12a90 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
12aa0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
12ab0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
12ac0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
12ad0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
12b00 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
12b10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12b30 6e 50 61 67 65 48 65 61 64 65 72 3e 6e 50 61 67  nPageHeader>nPag
12b40 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
12b50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
12b60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
12b70 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12b80 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
12b90 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
12ba0 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
12bb0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
12bc0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
12bd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
12be0 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
12bf0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
12c00 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53  e = (u16)usableS
12c10 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
12c20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12c30 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
12c40 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
12c50 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
12c60 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
12c70 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
12c80 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
12c90 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
12ca0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
12cb0 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
12cc0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
12cd0 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
12ce0 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
12cf0 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
12d00 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
12d10 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
12d20 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
12d30 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
12d40 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
12d50 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
12d60 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
12d70 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
12d80 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
12d90 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
12da0 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
12db0 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
12dc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
12dd0 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
12de0 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
12df0 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
12e00 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
12e10 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
12e20 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
12e30 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
12e40 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
12e50 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
12e60 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
12e70 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
12e80 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
12e90 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
12ea0 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
12eb0 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
12ec0 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
12ed0 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
12ee0 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
12ef0 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
12f00 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
12f10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
12f20 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b  12)*64/255 - 23;
12f30 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
12f40 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
12f50 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
12f60 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c   23;.  pBt->maxL
12f70 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eaf = pBt->usabl
12f80 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42  eSize - 35;.  pB
12f90 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42  t->minLeaf = (pB
12fa0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
12fb0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20  )*32/255 - 23;. 
12fc0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
12fd0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
12fe0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
12ff0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
13000 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
13010 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
13020 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13030 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
13040 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
13050 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13060 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13070 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
13080 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
13090 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
130a0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
130b0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
130c0 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
130d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
130e0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
130f0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
13100 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
13110 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
13120 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
13130 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
13140 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
13150 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
13160 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
13170 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
13180 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
13190 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
131a0 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
131b0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
131c0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
131d0 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
131e0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
131f0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
13200 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13210 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13230 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
13240 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13250 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
13260 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
13270 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13280 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
13290 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
132a0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
132b0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
132c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
132d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
132e0 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
132f0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13300 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
13310 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
13320 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
13330 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
13340 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
13350 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
13360 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
13370 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
13380 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
13390 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
133a0 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
133b0 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
133c0 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
133d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
133e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
133f0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
13400 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
13410 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
13420 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
13430 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
13440 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13450 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
13460 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
13470 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
13480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13490 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
134a0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
134b0 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
134c0 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
134d0 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
134e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
134f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
13500 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13510 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
13520 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
13530 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
13540 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
13550 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
13560 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75  der)==16 );.  pu
13570 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d  t2byte(&data[16]
13580 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
13590 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
135a0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
135b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
135c0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
135d0 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
135e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
135f0 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
13600 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
13610 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
13620 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
13630 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
13640 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
13650 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
13660 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
13670 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
13680 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
13690 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
136a0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
136b0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
136c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
136d0 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
136e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
136f0 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
13700 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13710 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
13720 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
13730 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
13740 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
13750 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
13760 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
13770 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
13780 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
13790 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
137a0 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
137b0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
137c0 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
137d0 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
137e0 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
137f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13800 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
13810 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
13820 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
13830 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
13840 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
13850 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
13860 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
13870 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
13880 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
13890 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
138a0 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
138b0 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
138c0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
138d0 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
138e0 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
138f0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
13900 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
13910 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
13920 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
13930 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
13940 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
13950 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
13960 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
13970 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
13980 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
13990 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
139a0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
139b0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
139c0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
139d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
139e0 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
139f0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
13a00 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
13a10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
13a20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
13a30 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
13a40 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
13a50 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
13a60 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
13a70 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
13a80 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
13a90 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
13aa0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
13ab0 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
13ac0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13ad0 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
13ae0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13af0 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
13b00 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13b10 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
13b20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
13b30 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
13b40 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
13b50 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
13b60 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
13b70 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
13b80 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
13b90 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
13ba0 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
13bb0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
13bc0 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
13bd0 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
13be0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
13bf0 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
13c00 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
13c10 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
13c20 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
13c30 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
13c40 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
13c50 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
13c60 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
13c70 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
13c80 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
13c90 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
13ca0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
13cb0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
13cc0 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
13cd0 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
13ce0 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
13cf0 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
13d00 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
13d10 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
13d20 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
13d30 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
13d40 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
13d50 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
13d60 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
13d70 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
13d80 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
13d90 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
13da0 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
13db0 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
13dc0 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
13dd0 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
13de0 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
13df0 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
13e00 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
13e10 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
13e20 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
13e30 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
13e40 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
13e50 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
13e60 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
13e70 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
13e80 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
13e90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
13ea0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
13eb0 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
13ec0 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  wrflag){.  sqlit
13ed0 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
13ee0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13ef0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
13f00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13f10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13f20 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
13f30 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
13f40 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
13f50 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
13f60 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13f70 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
13f80 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
13f90 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
13fa0 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
13fb0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
13fc0 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
13fd0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
13fe0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
13ff0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
14000 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
14010 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
14020 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
14030 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
14040 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  }..  /* Write tr
14050 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
14060 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
14070 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
14080 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ase */.  if( pBt
14090 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
140a0 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
140b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
140c0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
140d0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
140e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
140f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14100 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
14110 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
14120 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
14130 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
14140 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
14150 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
14160 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
14170 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
14180 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
14190 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
141a0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
141b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
141c0 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
141d0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
141e0 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
141f0 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20  >isPending ){.  
14200 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
14210 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
14220 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
14230 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
14240 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
14250 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
14260 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
14270 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
14280 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
14290 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
142a0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
142b0 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
142c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
142d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
142e0 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
142f0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
14300 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
14310 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
14320 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
14330 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
14340 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
14350 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
14360 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
14370 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
14380 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
14390 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
143a0 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
143b0 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
143c0 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
143d0 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
143e0 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
143f0 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
14400 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
14410 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
14420 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
14430 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
14440 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
14450 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
14460 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
14470 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
14480 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
14490 20 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79    pBt->initially
144a0 45 6d 70 74 79 20 3d 20 28 75 38 29 28 70 42 74  Empty = (u8)(pBt
144b0 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a 20 20 64  ->nPage==0);.  d
144c0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
144d0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
144e0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
144f0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
14500 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
14510 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
14520 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
14530 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
14540 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
14550 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
14560 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
14570 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
14580 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
14590 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
145a0 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
145b0 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
145c0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
145d0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
145e0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
145f0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
14600 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
14610 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
14620 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
14630 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
14640 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
14650 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
14660 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
14670 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
14680 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
14690 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
146a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
146b0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
146c0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
146d0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
146e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
146f0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
14700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14710 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14720 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
14730 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
14740 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
14750 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
14760 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14780 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
14790 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
147a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
147b0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
147c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
147d0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
147e0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
147f0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72    }.  }while( (r
14800 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
14810 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
14820 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
14830 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
14840 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
14850 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
14860 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
14870 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14880 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
14890 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
148a0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
148b0 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
148c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
148d0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
148e0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
148f0 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
14900 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
14910 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
14920 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
14930 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
14940 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
14950 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
14960 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
14970 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
14980 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
14990 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
149a0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
149b0 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
149c0 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
149d0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
149e0 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
149f0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
14a00 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14a10 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
14a20 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
14a30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14a40 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28  ED_CACHE.    if(
14a50 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
14a60 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
14a70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
14a80 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
14a90 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45  ;.      pBt->isE
14aa0 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28  xclusive = (u8)(
14ab0 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d  wrflag>1);.    }
14ac0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72  .#endif.  }...tr
14ad0 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
14ae0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14af0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
14b00 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
14b10 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
14b20 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
14b30 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
14b40 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
14b50 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
14b60 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
14b70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
14b80 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
14b90 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
14ba0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
14bb0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
14bc0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
14bd0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
14be0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
14bf0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
14c00 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
14c10 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
14c20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14c30 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
14c40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14c60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14c70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
14c80 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
14c90 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
14ca0 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
14cb0 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
14cc0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
14cd0 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
14ce0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
14cf0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
14d00 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
14d10 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
14d20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
14d30 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
14d40 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
14d50 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
14d60 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
14d70 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d90 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
14da0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
14db0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14dd0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
14de0 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
14df0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14e20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
14e30 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
14e40 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
14e50 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
14e60 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
14e70 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
14e80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14e90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14ea0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
14eb0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
14ec0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
14ed0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
14ef0 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
14f00 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
14f10 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
14f20 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
14f30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
14f40 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
14f50 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
14f60 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
14f70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
14f80 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
14f90 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
14fa0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
14fb0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
14fc0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
14fd0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
14fe0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
14ff0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
15000 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
15010 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
15020 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
15030 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
15040 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
15050 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
15060 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
15070 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
15080 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
15090 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
150a0 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  rc);.  }..set_ch
150b0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
150c0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
150d0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
150e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
150f0 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
15100 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
15110 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
15120 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
15130 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
15140 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
15150 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
15160 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
15170 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
15180 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
15190 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
151a0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
151b0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
151c0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
151d0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
151e0 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
151f0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
15200 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
15210 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
15220 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
15230 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
15240 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
15250 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
15260 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
15270 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
15280 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
15290 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
152a0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
152b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
152c0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
152d0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
152e0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
152f0 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
15320 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
15330 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
15340 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
15350 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
15360 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
15370 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
15380 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15390 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
153a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
153b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
153c0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
153d0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
153e0 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
153f0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
15400 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
15410 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
15420 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
15430 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
15440 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
15450 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
15460 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
15470 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
15480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15490 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
154a0 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
154b0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
154c0 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
154d0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
154e0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
154f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
15500 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
15510 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
15520 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
15530 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
15540 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15550 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
15560 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
15570 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
15580 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
15590 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
155a0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
155b0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
155c0 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
155d0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
155e0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
155f0 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
15600 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
15610 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
15620 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
15630 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
15640 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
15650 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
15660 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
15670 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
15680 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
156a0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
156b0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
156c0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
156d0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
156e0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
156f0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
15700 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
15710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15720 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
15730 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
15740 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
15750 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
15760 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
15770 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
15780 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
15790 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
157a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
157b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
157c0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
157d0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
157e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
157f0 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
15800 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
15810 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
15820 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15830 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
15840 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
15850 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
15860 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
15870 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
15880 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
15890 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
158a0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
158b0 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
158c0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
158d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
158e0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
158f0 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
15900 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
15910 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
15920 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
15930 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
15940 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
15950 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
15960 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
15970 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
15980 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
15990 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
159a0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
159b0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
159c0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
159d0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
159e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
159f0 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
15a00 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
15a10 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a30 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
15a40 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
15a50 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
15a60 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
15a70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
15a80 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
15a90 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15aa0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
15ab0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
15ac0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
15ad0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
15ae0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
15af0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
15b00 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
15b10 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
15b20 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
15b30 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
15b40 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
15b50 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
15b60 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
15b70 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
15b80 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
15b90 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
15ba0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
15bb0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
15bc0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15bd0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
15be0 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
15bf0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
15c00 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
15c10 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
15c20 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
15c30 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
15c40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15c50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
15c60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
15c70 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
15c80 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
15c90 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
15ca0 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
15cb0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
15cc0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
15cd0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
15ce0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
15cf0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
15d00 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
15d10 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
15d20 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
15d30 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
15d40 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
15d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15d60 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
15d70 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
15d80 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
15d90 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
15da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15db0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
15dc0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
15dd0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
15de0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
15df0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
15e00 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
15e10 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
15e20 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
15e30 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
15e40 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
15e50 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
15e60 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
15e70 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
15e80 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
15e90 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
15ea0 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
15eb0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
15ec0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
15ed0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
15ee0 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
15ef0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
15f00 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
15f10 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15f20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
15f30 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
15f40 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
15f50 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
15f60 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
15f70 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
15f80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
15f90 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
15fa0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
15fb0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
15fc0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
15fd0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15ff0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16000 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
16010 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
16020 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
16030 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
16040 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
16050 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
16060 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
16070 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
16080 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
16090 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
160a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
160b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
160c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
160d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
160e0 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
160f0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
16100 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
16110 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
16120 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
16130 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
16140 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
16150 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
16160 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
16170 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
16180 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
16190 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
161a0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
161b0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
161c0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
161d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
161e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
161f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16210 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
16220 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16240 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
16250 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
16260 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
16270 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
16280 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
16290 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
162a0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
162b0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
162c0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
162d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
162e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
162f0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
16300 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
16310 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
16320 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
16330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16340 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
16350 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
16360 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
16370 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
16380 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
16390 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
163a0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
163b0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
163c0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
163d0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
163e0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
163f0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
16400 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
16410 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
16420 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
16430 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
16440 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
16450 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
16460 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
16470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16480 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
16490 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
164a0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
164b0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
164c0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
164d0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
164e0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
164f0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
16500 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
16510 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
16520 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
16530 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
16540 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
16550 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
16560 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
16570 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
16580 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
16590 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
165a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
165b0 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
165c0 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
165d0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
165e0 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
165f0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
16600 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
16610 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
16620 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46  complete.  If nF
16630 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69  in is zero, it i
16640 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
16650 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  * incrVacuumStep
16660 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
16670 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e  d a finite amoun
16680 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68  t of times.** wh
16690 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
166a0 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72 65  ot empty the fre
166b0 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61  elist.  A full a
166c0 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73  utovacuum.** has
166d0 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41   nFin>0.  A "PRA
166e0 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
166f0 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e  vacuum" has nFin
16700 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ==0..*/.static i
16710 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
16720 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
16730 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
16740 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
16750 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
16760 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16770 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
16780 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
16790 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
167a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
167b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
167c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
167d0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
167e0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
167f0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
16800 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
16810 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
16820 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
16830 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
16840 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
16850 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
16860 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
16870 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
16880 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
16890 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
168a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
168b0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
168c0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
168d0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
168e0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
168f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16910 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16920 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
16930 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
16940 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16950 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16960 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
16970 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
16980 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
16990 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
169a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
169b0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
169c0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
169d0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
169e0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
169f0 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
16a00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
16a10 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
16a20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
16a30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
16a40 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
16a50 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
16a60 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
16a70 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
16a80 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
16a90 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
16aa0 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
16ab0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
16ac0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
16ad0 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
16ae0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
16af0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
16b00 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
16b10 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
16b20 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
16b30 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
16b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16b50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16b60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16b70 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
16b80 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
16b90 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
16ba0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
16bb0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
16bc0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
16bd0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
16be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
16bf0 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
16c00 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
16c10 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
16c20 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
16c30 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
16c40 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
16c50 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
16c60 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
16c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16c80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16c90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16ca0 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
16cb0 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
16cc0 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
16cd0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
16ce0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
16cf0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
16d00 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
16d10 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
16d20 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
16d30 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
16d40 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
16d50 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
16d60 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
16d70 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
16d80 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
16d90 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
16da0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
16db0 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
16dc0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
16dd0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
16de0 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
16df0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
16e00 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
16e10 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
16e20 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
16e30 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
16e40 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
16e50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16e60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16e70 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
16e80 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
16e90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
16eb0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
16ec0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
16ed0 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
16ee0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
16ef0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
16f00 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
16f10 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
16f20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16f30 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
16f40 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
16f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16f60 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
16f70 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
16f80 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
16f90 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
16fa0 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
16fb0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
16fc0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
16fd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
17010 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
17020 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
17030 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
17040 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
17050 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
17060 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
17070 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
17080 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
17090 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
170a0 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
170b0 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
170c0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
170d0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
170e0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
170f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17110 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17130 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17140 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
17150 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
17160 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
17170 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17190 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
171a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
171b0 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
171c0 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
171d0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
171e0 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
171f0 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
17200 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
17210 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
17220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
17240 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
17250 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
17260 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
17270 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
17280 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
17290 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
172a0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
172b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
172c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
172d0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
172e0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
172f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
17300 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
17310 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
17320 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
17330 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
17340 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
17350 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
17360 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
17370 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
17380 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
17390 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
173a0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
173b0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
173c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
173d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
173e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
173f0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
17400 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
17410 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
17420 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
17430 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
17440 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
17450 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
17460 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
17470 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
17480 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
17490 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
174a0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
174b0 70 28 70 42 74 2c 20 30 2c 20 62 74 72 65 65 50  p(pBt, 0, btreeP
174c0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
174d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
174e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
174f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17500 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
17510 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
17520 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
17530 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
17540 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
17550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
17560 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17570 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17590 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
175a0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
175b0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
175c0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
175d0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
175e0 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
175f0 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
17600 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
17610 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
17620 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
17630 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
17640 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
17650 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
17660 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
17670 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
17680 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
17690 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
176a0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
176b0 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
176c0 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
176d0 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
176e0 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
176f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
17700 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
17710 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
17720 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17730 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
17740 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
17750 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
17760 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
17770 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
17780 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
17790 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
177a0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
177b0 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
177c0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
177d0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
177e0 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
177f0 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
17800 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
17810 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
17820 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17830 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
17840 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
17850 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
17860 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
17870 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17880 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
17890 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
178a0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  */.    Pgno nPtr
178b0 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  map;      /* Num
178c0 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
178d0 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
178e0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
178f0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
17900 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
17910 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e   freed */.    in
17920 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
17930 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
17940 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
17950 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  map page */.    
17960 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
17970 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
17980 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
17990 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
179a0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
179b0 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
179c0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
179d0 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
179e0 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
179f0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
17a00 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
17a10 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
17a20 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
17a30 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
17a40 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
17a50 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
17a60 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
17a70 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
17a80 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
17a90 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
17aa0 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
17ab0 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
17ac0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
17ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17ae0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
17af0 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
17b00 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
17b10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
17b20 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d  ]);.    nEntry =
17b30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17b40 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20  /5;.    nPtrmap 
17b50 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
17b60 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
17b70 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
17b80 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69  /nEntry;.    nFi
17b90 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
17ba0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
17bb0 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
17bc0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
17bd0 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
17be0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
17bf0 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
17c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
17c10 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
17c20 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
17c30 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
17c40 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
17c50 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
17c60 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e   }.    if( nFin>
17c70 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
17c80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
17c90 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72  PT;..    for(iFr
17ca0 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
17cb0 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
17cc0 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
17cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
17ce0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
17cf0 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20  nFin, iFree);.  
17d00 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
17d10 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
17d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
17d30 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
17d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17d50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
17d60 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
17d70 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
17d80 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
17d90 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
17da0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
17db0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
17dc0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
17dd0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
17de0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
17df0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 73 71   nFin);.      sq
17e00 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
17e10 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
17e20 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  ger, nFin);.    
17e30 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
17e40 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
17e50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17e60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17e70 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
17e80 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
17e90 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
17ea0 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
17eb0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
17ec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17ed0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
17ee0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17ef0 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
17f00 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
17f10 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
17f20 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
17f30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
17f40 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
17f50 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
17f60 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
17f70 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
17f80 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
17f90 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
17fa0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
17fb0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
17fc0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
17fd0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
17fe0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
17ff0 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
18000 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
18010 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
18020 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
18030 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
18040 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
18050 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
18060 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
18070 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
18080 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
18090 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
180a0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
180b0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
180c0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
180d0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
180e0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
180f0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
18100 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
18110 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
18120 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
18130 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
18140 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18150 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
18160 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
18170 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
18180 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
18190 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
181a0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
181b0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
181c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
181d0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
181e0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
181f0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
18200 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
18210 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
18220 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
18230 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
18240 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
18250 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
18260 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
18270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18280 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
18290 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
182a0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
182b0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
182c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
182d0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
182e0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
182f0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
18300 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
18310 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
18320 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
18330 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
18340 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
18350 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
18360 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
18370 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
18380 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
18390 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
183a0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
183b0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
183c0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
183d0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
183e0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
183f0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
18400 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
18410 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
18420 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
18430 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
18440 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
18450 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
18460 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
18470 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
18480 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
18490 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
184a0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
184b0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
184c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
184d0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
184e0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
184f0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
18500 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18510 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
18520 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
18530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18540 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
18550 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
18560 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
18570 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
18580 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
18590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
185a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
185b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
185c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
185d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
185e0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
185f0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
18600 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
18610 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
18620 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
18630 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18640 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18650 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
18660 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
18670 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
18680 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
18690 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
186a0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
186b0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
186c0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
186d0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
186e0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
186f0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
18700 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
18710 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
18720 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
18730 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62 74 72  tex(p) );..  btr
18740 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
18750 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70 2d  t(pBt);.  if( p-
18760 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
18770 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63  ONE && p->db->ac
18780 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b  tiveVdbeCnt>1 ){
18790 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
187a0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
187b0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
187c0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
187d0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
187e0 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
187f0 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
18800 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
18810 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
18820 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
18830 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
18840 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
18850 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
18860 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
18870 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
18880 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
18890 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
188a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
188b0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
188c0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
188d0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
188e0 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
188f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
18900 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
18910 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
18920 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
18930 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
18940 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
18950 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
18960 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
18970 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
18980 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
18990 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
189a0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
189b0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
189c0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
189d0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
189e0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
189f0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
18a00 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
18a10 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
18a20 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
18a30 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
18a40 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18a50 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
18a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18a70 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
18a80 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
18a90 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
18aa0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
18ab0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
18ac0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
18ad0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
18ae0 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
18af0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
18b00 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
18b10 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
18b20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
18b30 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
18b40 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
18b50 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
18b60 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
18b70 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
18b80 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
18b90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18ba0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
18bb0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
18bc0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
18bd0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
18be0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18bf0 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
18c00 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
18c10 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
18c20 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
18c30 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
18c40 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
18c50 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18c60 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
18c70 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
18c80 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
18c90 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
18ca0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
18cb0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
18cc0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
18cd0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
18ce0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
18cf0 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
18d00 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
18d10 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
18d20 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
18d30 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
18d40 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
18d50 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
18d60 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
18d70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
18d80 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
18d90 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
18da0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
18db0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
18dc0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
18dd0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
18de0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
18df0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
18e00 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
18e10 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
18e20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18e30 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
18e40 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
18e50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18e60 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
18e70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
18e80 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
18e90 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
18ea0 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
18eb0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
18ec0 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
18ed0 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
18ee0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
18ef0 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
18f00 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
18f10 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
18f20 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
18f30 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
18f40 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
18f50 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
18f60 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
18f70 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
18f80 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
18f90 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
18fa0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18fb0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
18fc0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
18fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
18ff0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19000 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
19010 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
19020 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
19030 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
19040 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
19050 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
19060 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19070 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
19080 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19090 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
190a0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
190b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
190c0 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
190d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
190e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
190f0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
19100 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
19110 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
19120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19130 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
19140 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
19150 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
19160 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19170 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19180 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
19190 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
191a0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
191b0 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
191c0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
191d0 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
191e0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
191f0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
19200 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
19210 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
19220 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
19230 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
19240 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
19250 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
19260 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
19270 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
19280 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
19290 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
192a0 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
192b0 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
192c0 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
192d0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
192e0 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
192f0 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
19300 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
19310 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
19320 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
19330 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
19340 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
19350 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
19360 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
19370 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
19380 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
19390 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
193a0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
193b0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
193c0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
193d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
193e0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
193f0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
19400 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
19410 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19420 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
19430 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
19440 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
19450 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
19460 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
19470 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
19480 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
19490 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
194a0 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
194b0 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
194c0 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
194d0 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
194e0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
194f0 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
19500 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
19510 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
19520 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
19530 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
19540 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
19550 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
19560 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
19570 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
19580 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
19590 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
195a0 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
195b0 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
195c0 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
195d0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
195e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
195f0 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
19600 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
19610 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
19620 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
19630 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
19640 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
19650 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
19660 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
19670 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
19680 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
19690 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
196a0 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
196b0 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
196c0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
196d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
196e0 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
196f0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
19700 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
19710 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
19720 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19730 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
19740 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
19750 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
19760 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
19770 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72  errCode;.    for
19780 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
19790 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
197a0 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70  eleasePage(p->ap
197b0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Page[i]);.      
197c0 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  p->apPage[i] = 0
197d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
197e0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
197f0 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pBtree);.}../*.*
19800 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
19810 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
19820 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72  ogress.  All cur
19830 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  sors will be.** 
19840 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69  invalided by thi
19850 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
19860 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
19870 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61   a cursor.** tha
19880 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
19890 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
198a0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  his operation wi
198b0 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
198c0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
198d0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
198e0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
198f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19900 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
19910 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
19920 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
19930 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
19940 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
19950 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
19960 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29  llback(Btree *p)
19970 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
19980 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19990 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
199a0 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69  *pPage1;..  sqli
199b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
199c0 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  ;.  rc = saveAll
199d0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
199e0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
199f0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
19a00 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53  ACHE.  if( rc!=S
19a10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19a20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72  /* This is a hor
19a30 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e  rible situation.
19a40 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   An IO or malloc
19a50 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  () error occurre
19a60 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
19a70 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
19a80 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
19a90 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
19aa0 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
19ab0 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
19ac0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
19ad0 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
19ae0 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
19af0 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
19b00 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
19b10 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
19b20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
19b30 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
19b40 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
19b50 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
19b60 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
19b70 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
19b80 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
19b90 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
19ba0 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
19bb0 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
19bc0 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
19bd0 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
19be0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
19bf0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
19c00 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d  sors(p, rc);.  }
19c10 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49  .#endif.  btreeI
19c20 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
19c30 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
19c40 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
19c50 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
19c60 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
19c70 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
19c80 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
19c90 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
19ca0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
19cb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
19cc0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
19cd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
19ce0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
19cf0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
19d00 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
19d10 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
19d20 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
19d30 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
19d40 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
19d50 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
19d60 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
19d70 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
19d80 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
19d90 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
19da0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
19db0 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
19dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
19dd0 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
19de0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
19df0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
19e00 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
19e10 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
19e20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
19e30 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
19e40 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
19e50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
19e60 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
19e70 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
19e80 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19e90 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
19ea0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
19eb0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19ec0 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
19ed0 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
19ee0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
19ef0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
19f00 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  EAD;.  }..  btre
19f10 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
19f20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
19f30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19f40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19f50 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
19f60 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
19f70 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
19f80 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62  action can can b
19f90 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
19fa0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
19fb0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
19fc0 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
19fd0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
19fe0 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
19ff0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
1a000 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1a010 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
1a020 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
1a030 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
1a040 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1a050 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
1a060 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
1a070 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1a080 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
1a090 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
1a0a0 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
1a0b0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
1a0c0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
1a0d0 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
1a0e0 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
1a0f0 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
1a100 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1a110 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
1a120 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
1a130 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
1a140 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
1a150 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1a160 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1a170 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1a180 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
1a190 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
1a1a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
1a1b0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
1a1c0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1a1d0 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
1a1e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1a1f0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1a200 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1a210 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
1a220 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
1a230 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
1a240 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
1a250 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
1a260 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
1a270 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1a280 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
1a290 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
1a2a0 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
1a2b0 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
1a2c0 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
1a2d0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1a2e0 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
1a2f0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
1a300 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
1a310 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1a320 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
1a330 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a340 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
1a350 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
1a360 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
1a370 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1a380 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1a390 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a3a0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
1a3b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a3c0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1a3d0 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  t( pBt->readOnly
1a3e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1a3f0 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
1a400 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
1a410 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
1a420 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
1a430 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1a440 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1a450 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
1a460 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
1a470 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1a480 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
1a490 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
1a4a0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
1a4b0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
1a4c0 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
1a4d0 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
1a4e0 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
1a4f0 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
1a500 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
1a510 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
1a520 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
1a530 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
1a540 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
1a550 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1a560 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
1a570 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1a580 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1a590 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1a5a0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
1a5b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1a5c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1a5d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
1a5e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1a5f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1a600 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
1a610 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1a620 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
1a630 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
1a640 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
1a650 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
1a660 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
1a670 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
1a680 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
1a690 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
1a6a0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
1a6b0 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
1a6c0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1a6d0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
1a6e0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1a6f0 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
1a700 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
1a710 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1a720 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
1a730 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
1a740 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
1a750 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
1a760 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
1a770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
1a780 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
1a790 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
1a7a0 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
1a7b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
1a7c0 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
1a7d0 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
1a7e0 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
1a7f0 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
1a800 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
1a810 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
1a820 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1a830 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
1a840 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
1a850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1a860 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
1a870 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1a880 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1a890 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1a8a0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
1a8b0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
1a8c0 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
1a8d0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
1a8e0 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
1a8f0 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
1a900 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
1a910 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1a920 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
1a930 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a940 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a950 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
1a960 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
1a970 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
1a980 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1a9a0 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
1a9b0 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79 45   pBt->initiallyE
1a9c0 6d 70 74 79 20 29 20 70 42 74 2d 3e 6e 50 61 67  mpty ) pBt->nPag
1a9d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1a9e0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1a9f0 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  t);.      pBt->n
1aa00 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1aa10 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31  28 + pBt->pPage1
1aa20 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
1aa30 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1aa40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1aa50 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1aa60 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1aa70 28 69 6e 74 2a 29 26 70 42 74 2d 3e 6e 50 61 67  (int*)&pBt->nPag
1aa80 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1aa90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1aaa0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1aab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aac0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1aad0 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1aae0 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1aaf0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1ab00 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1ab10 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1ab20 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1ab30 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1ab40 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1ab50 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1ab60 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1ab70 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1ab80 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1ab90 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1aba0 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1abb0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1abc0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1abd0 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1abe0 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1abf0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1ac00 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1ac10 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1ac20 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1ac30 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1ac40 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1ac50 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1ac60 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1ac70 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1ac80 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1ac90 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1aca0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1acb0 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1acc0 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1acd0 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1ace0 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1acf0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1ad00 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1ad10 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1ad20 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1ad30 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1ad40 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1ad50 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1ad60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1ad70 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1ad80 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1ad90 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1ada0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1adb0 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
1adc0 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
1add0 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
1ade0 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
1adf0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
1ae00 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
1ae10 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
1ae20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1ae30 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
1ae40 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
1ae50 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
1ae60 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
1ae70 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
1ae80 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1ae90 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
1aea0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
1aeb0 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
1aec0 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
1aed0 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
1aee0 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
1aef0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
1af00 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
1af10 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
1af20 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
1af30 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
1af40 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
1af50 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
1af60 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1af70 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
1af80 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
1af90 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1afa0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
1afb0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1afc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1afd0 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
1afe0 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
1aff0 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
1b000 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
1b010 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
1b020 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1b030 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
1b040 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1b050 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1b080 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1b090 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1b0c0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1b0d0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1b100 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1b110 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1b120 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1b130 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1b140 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1b150 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1b160 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1b170 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1b1a0 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1b1b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b1c0 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1b1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1b1e0 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1b1f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1b200 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1b210 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1b220 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1b230 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1b240 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1b250 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1b260 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1b270 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1b280 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1b290 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1b2a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1b2b0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1b2c0 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1b2d0 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1b2e0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1b2f0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1b300 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1b310 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1b320 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1b330 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1b340 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1b350 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1b360 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1b370 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1b380 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1b390 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1b3a0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1b3b0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1b3c0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1b3d0 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1b3e0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1b3f0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1b400 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1b410 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1b420 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1b430 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b440 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1b450 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1b460 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1b470 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1b480 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1b490 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
1b4a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1b4b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1b4c0 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
1b4d0 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
1b4e0 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
1b4f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b500 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20  E_EMPTY;.  }..  
1b510 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
1b520 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
1b530 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
1b540 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
1b550 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
1b560 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
1b570 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
1b580 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
1b590 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
1b5a0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
1b5b0 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
1b5c0 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
1b5d0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1b5e0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
1b5f0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
1b600 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
1b610 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
1b620 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
1b630 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
1b640 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1b650 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1b660 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1b670 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
1b680 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
1b690 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
1b6a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1b6b0 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
1b6c0 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
1b6d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b6e0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1b6f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1b700 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b730 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1b740 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b770 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1b780 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1b790 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1b7c0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1b7d0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1b7e0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1b7f0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1b800 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1b810 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1b820 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1b830 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1b860 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1b870 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1b880 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1b890 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1b8a0 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1b8b0 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1b8c0 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1b8d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b8e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b900 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1b910 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1b920 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1b930 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1b940 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1b950 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1b960 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1b970 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1b980 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1b990 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1b9a0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1b9b0 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1b9c0 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1b9d0 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1b9e0 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1b9f0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1ba00 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1ba10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ba20 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1ba30 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
1ba40 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
1ba50 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
1ba60 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1ba70 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
1ba80 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1ba90 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1baa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
1bab0 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
1bac0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
1bad0 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
1bae0 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
1baf0 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
1bb00 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
1bb10 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
1bb20 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
1bb30 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1bb40 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
1bb50 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
1bb60 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
1bb70 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
1bb80 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
1bb90 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
1bba0 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
1bbb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1bbc0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1bbd0 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1bbe0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
1bbf0 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
1bc00 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
1bc10 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
1bc20 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
1bc30 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
1bc40 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
1bc50 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
1bc60 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
1bc70 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
1bc80 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
1bc90 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
1bca0 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
1bcb0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
1bcc0 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
1bcd0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1bce0 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
1bcf0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
1bd00 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
1bd10 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
1bd20 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
1bd30 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
1bd40 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
1bd50 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
1bd60 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
1bd70 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
1bd80 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
1bd90 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1bda0 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
1bdb0 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
1bdc0 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
1bdd0 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
1bde0 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
1bdf0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
1be00 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
1be10 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1be20 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
1be30 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
1be40 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
1be50 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
1be60 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
1be70 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1be80 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
1be90 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
1bea0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
1beb0 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
1bec0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1bed0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1bee0 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
1bef0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
1bf00 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1bf10 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
1bf20 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
1bf30 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
1bf40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1bf50 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
1bf60 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
1bf70 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
1bf80 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
1bf90 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1bfa0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1bfb0 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
1bfc0 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1bfd0 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
1bfe0 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
1bff0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
1c000 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
1c010 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
1c020 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1c030 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1c040 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
1c050 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1c060 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1c070 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
1c080 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
1c090 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1c0a0 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1c0b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c0c0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1c0d0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1c0e0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1c0f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c100 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1c110 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1c120 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1c130 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1c140 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1c150 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1c160 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c170 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1c180 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1c190 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1c1a0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1c1b0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1c1c0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1c1d0 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1c1e0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1c1f0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1c200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1c210 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1c220 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1c230 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1c240 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1c250 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1c260 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1c270 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1c280 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1c290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1c2a0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1c2b0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1c2c0 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1c2d0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1c2e0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
1c2f0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
1c300 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
1c310 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
1c320 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1c330 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1c340 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1c350 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c360 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1c370 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1c380 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1c390 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1c3a0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1c3b0 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1c3c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1c3d0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
1c3e0 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1c3f0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1c400 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1c410 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1c420 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1c430 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1c440 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1c450 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1c460 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1c470 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
1c480 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
1c490 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
1c4a0 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
1c4b0 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
1c4c0 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
1c4d0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
1c4e0 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
1c4f0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
1c500 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
1c510 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
1c520 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
1c530 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
1c540 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
1c550 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
1c560 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
1c570 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
1c580 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
1c590 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
1c5a0 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
1c5b0 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
1c5c0 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
1c5d0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
1c5e0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
1c5f0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
1c600 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
1c610 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
1c620 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
1c630 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
1c640 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
1c650 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1c660 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
1c670 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
1c680 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1c690 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
1c6a0 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
1c6b0 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
1c6c0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1c6d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1c6e0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1c6f0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
1c700 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1c710 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1c720 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1c730 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1c740 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1c750 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1c760 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1c770 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1c780 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1c790 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1c7a0 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1c7b0 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1c7c0 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1c7d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1c7e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1c7f0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1c800 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1c810 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1c820 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1c830 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1c840 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1c850 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1c860 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1c870 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1c880 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1c890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c8a0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1c8b0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1c8c0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
1c8d0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
1c8e0 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
1c8f0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
1c900 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
1c910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
1c920 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
1c930 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1c940 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
1c980 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1c990 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1c9d0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1c9e0 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
1ca20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1ca30 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1ca40 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1ca50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1ca60 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
1ca70 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1cb10 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb50 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1cb60 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1cb70 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  /..#ifndef NDEBU
1cb80 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  G  /* The next r
1cb90 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79  outine used only
1cba0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1cbb0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f   statements */./
1cbc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1cbd0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74   if the given Bt
1cbe0 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  Cursor is valid.
1cbf0 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72    A valid cursor
1cc00 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20   is one.** that 
1cc10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1cc20 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69  nting to a row i
1cc30 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20  n a (non-empty) 
1cc40 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69  table..** This i
1cc50 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e  s a verification
1cc60 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1cc70 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
1cc80 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cca0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1ccb0 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1ccc0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1ccd0 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  r && pCur->eStat
1cce0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
1ccf0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45  .}.#endif /* NDE
1cd00 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  BUG */../*.** Se
1cd10 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1cd20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
1cd30 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
1cd40 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
1cd50 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
1cd60 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
1cd70 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
1cd80 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
1cd90 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
1cda0 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
1cdb0 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
1cdc0 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
1cdd0 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
1cde0 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
1cdf0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
1ce00 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
1ce10 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1ce20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
1ce30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1ce40 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e  er must position
1ce50 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f   the cursor prio
1ce60 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1ce70 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  is routine..** .
1ce80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ce90 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74  cannot fail.  It
1cea0 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1ceb0 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a  SQLITE_OK.  .*/.
1cec0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ced0 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1cee0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1cef0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1cf00 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1cf10 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1cf20 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1cf30 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1cf40 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
1cf50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1cf60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1cf70 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
1cf80 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20  D ){.    *pSize 
1cf90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1cfa0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1cfb0 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ur);.    *pSize 
1cfc0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1cfd0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
1cfe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1cff0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1d000 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1d010 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1d020 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
1d030 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
1d040 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
1d050 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1d060 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
1d070 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
1d080 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
1d090 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
1d0a0 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
1d0b0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
1d0c0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
1d0d0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
1d0e0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1d0f0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
1d100 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1d110 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
1d120 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
1d130 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
1d140 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1d150 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
1d160 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
1d170 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
1d180 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
1d190 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
1d1a0 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
1d1b0 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
1d1c0 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
1d1d0 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
1d1e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1d1f0 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
1d200 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
1d210 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1d220 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1d230 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1d240 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1d250 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1d260 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
1d270 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
1d280 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1d290 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53  Data;.  return S
1d2a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d2b0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
1d2c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
1d2d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1d2e0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
1d2f0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
1d300 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1d310 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
1d320 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1d330 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
1d340 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
1d350 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1d360 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
1d370 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
1d380 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
1d390 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
1d3a0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
1d3b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1d3c0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
1d3d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1d3e0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
1d3f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1d400 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1d410 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
1d420 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1d430 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
1d440 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1d450 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
1d460 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
1d470 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
1d480 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
1d490 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
1d4a0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
1d4b0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
1d4c0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
1d4d0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
1d4e0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
1d4f0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
1d500 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
1d510 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
1d520 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
1d530 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
1d540 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
1d550 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1d560 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
1d570 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
1d580 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1d590 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
1d5a0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
1d5b0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
1d5c0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
1d5d0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
1d5e0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
1d5f0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
1d600 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
1d610 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
1d620 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
1d630 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
1d640 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
1d650 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
1d660 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
1d670 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
1d680 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1d690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d6a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d6b0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
1d6e0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1d6f0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
1d700 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
1d710 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
1d720 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
1d730 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
1d740 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
1d750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1d760 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
1d770 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1d780 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
1d790 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1d7a0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
1d7b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d7c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d7d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1d7e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1d7f0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
1d800 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1d810 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1d820 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
1d830 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
1d840 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1d850 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
1d860 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
1d870 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1d880 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
1d890 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
1d8a0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
1d8b0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
1d8c0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
1d8d0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
1d8e0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
1d8f0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
1d900 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
1d910 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
1d920 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
1d930 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
1d940 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
1d950 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
1d960 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1d970 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
1d980 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
1d990 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
1d9a0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
1d9b0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1d9c0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
1d9d0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
1d9e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1d9f0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
1da00 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
1da10 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
1da20 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1da30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1da40 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
1da50 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
1da60 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1da70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1da80 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
1da90 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
1daa0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
1dab0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
1dac0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
1dad0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1dae0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1daf0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1db00 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
1db10 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1db20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1db30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
1db40 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1db50 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29  ovfl, &pPage, 0)
1db60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
1db70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1db80 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
1db90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dba0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1dbb0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1dbc0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1dbd0 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1dbe0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1dbf0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1dc00 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1dc10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1dc20 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1dc30 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1dc40 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1dc50 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1dc60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1dc70 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1dc80 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1dc90 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1dca0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1dcb0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1dcc0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1dcd0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1dce0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1dcf0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1dd00 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1dd10 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1dd20 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1dd30 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1dd40 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1dd50 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1dd60 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1dd70 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1dd80 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1dd90 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1dda0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1ddb0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1ddc0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1ddd0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1dde0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1ddf0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1de00 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1de10 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1de20 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1de30 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1de40 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1de50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1de60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1de70 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1de80 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1de90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1dea0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1deb0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ded0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1dee0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1def0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1df00 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1df10 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1df20 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1df30 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1df40 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1df50 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1df60 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1df70 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1df80 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1df90 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1dfa0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1dfb0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1dfc0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1dfd0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1dfe0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1dff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e000 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e010 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1e020 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1e030 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1e040 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1e050 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1e060 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1e070 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1e080 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1e090 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1e0a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e0b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1e0c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e0d0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1e0e0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1e0f0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1e100 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1e110 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1e120 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1e130 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1e140 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1e150 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1e160 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1e170 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1e180 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1e190 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1e1a0 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1e1b0 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1e1c0 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1e1d0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1e1e0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1e1f0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1e200 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1e210 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1e220 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1e230 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1e240 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
1e250 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
1e260 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
1e270 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
1e280 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
1e290 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
1e2a0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
1e2b0 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
1e2c0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1e2d0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1e2e0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1e2f0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1e300 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1e310 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1e320 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1e330 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1e340 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1e350 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1e360 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1e370 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1e380 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1e390 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1e3a0 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1e3b0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1e3c0 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1e3d0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1e3e0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1e3f0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1e400 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1e410 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1e420 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1e430 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1e440 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1e450 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1e460 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1e470 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1e480 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1e490 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1e4a0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1e4b0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1e4c0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1e4d0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1e4e0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1e4f0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1e500 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1e510 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1e520 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1e530 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1e540 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1e550 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1e560 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1e570 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1e580 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1e590 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1e5a0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1e5b0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1e5c0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1e5d0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1e5e0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1e5f0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1e600 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1e610 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1e620 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1e630 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1e640 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1e650 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e660 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1e670 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1e680 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1e690 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1e6a0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1e6b0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
1e6c0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1e6d0 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
1e6e0 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
1e6f0 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
1e700 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
1e710 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
1e720 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20  QLITE_OK;.  u32 
1e730 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78  nKey;.  int iIdx
1e740 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1e750 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
1e760 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e770 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
1e780 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
1e790 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
1e7a0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1e7b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e7c0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
1e7d0 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
1e7e0 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
1e7f0 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
1e800 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e810 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1e830 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1e840 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
1e850 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1e860 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1e870 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
1e880 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1e890 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1e8a0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
1e8b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
1e8c0 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
1e8d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
1e8e0 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  : (int)pCur->inf
1e8f0 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20  o.nKey);..  if( 
1e900 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74  NEVER(offset+amt
1e910 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
1e920 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c  fo.nData) .   ||
1e930 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
1e940 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
1e950 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
1e960 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
1e970 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
1e980 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
1e990 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
1e9a0 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
1e9b0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
1e9c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e9d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1e9e0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
1e9f0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
1ea00 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
1ea10 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
1ea20 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
1ea30 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
1ea40 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1ea50 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1ea60 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
1ea70 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1ea80 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
1ea90 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1eaa0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
1eab0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
1eac0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
1ead0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
1eae0 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
1eaf0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
1eb00 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
1eb10 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
1eb20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
1eb30 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
1eb40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
1eb50 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1eb60 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1eb70 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
1eb80 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
1eb90 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
1eba0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
1ebb0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
1ebc0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
1ebd0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
1ebe0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1ebf0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1ec00 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
1ec10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ec20 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1ec30 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
1ec40 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1ec50 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
1ec60 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1ec70 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
1ec80 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1ec90 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
1eca0 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
1ecb0 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
1ecc0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
1ecd0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
1ece0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1ecf0 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
1ed00 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
1ed10 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
1ed20 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
1ed30 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
1ed40 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
1ed50 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
1ed60 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
1ed70 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
1ed80 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
1ed90 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
1eda0 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
1edb0 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
1edc0 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
1edd0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
1ede0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1edf0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
1ee00 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
1ee10 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
1ee20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
1ee30 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
1ee40 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
1ee50 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
1ee60 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1ee70 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
1ee80 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f  *nOvfl);.      /
1ee90 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79  * nOvfl is alway
1eea0 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20  s positive.  If 
1eeb0 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65  it were zero, fe
1eec0 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64  tchPayload would
1eed0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62   have.      ** b
1eee0 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64  een used instead
1eef0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1ef00 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  . */.      if( A
1ef10 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20  LWAYS(nOvfl) && 
1ef20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1ef30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ef40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ef50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ef60 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
1ef70 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1ef80 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1ef90 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
1efa0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
1efb0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
1efc0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
1efd0 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
1efe0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
1eff0 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
1f000 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1f010 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
1f020 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
1f030 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
1f040 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
1f050 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
1f060 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1f070 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1f080 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
1f090 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
1f0a0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65  lSize);.    }.#e
1f0b0 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b  ndif..    for( ;
1f0c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f0d0 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
1f0e0 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23  age; iIdx++){..#
1f0f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f100 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1f110 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
1f120 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
1f130 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1f140 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
1f150 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1f160 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
1f170 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
1f180 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
1f190 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
1f1a0 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
1f1b0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
1f1c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1f1d0 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
1f1e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1f1f0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
1f200 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1f210 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
1f220 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
1f230 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
1f240 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
1f250 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
1f260 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
1f270 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1f280 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
1f290 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
1f2a0 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
1f2b0 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
1f2c0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
1f2d0 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
1f2e0 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
1f2f0 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
1f300 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
1f310 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
1f320 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
1f330 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
1f340 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1f350 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1f360 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
1f370 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
1f380 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1f390 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
1f3a0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1f3b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1f3c0 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
1f3d0 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a   } else .#endif.
1f3e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
1f3f0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
1f400 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
1f410 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
1f420 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
1f430 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
1f440 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1f450 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
1f460 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
1f470 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
1f480 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
1f490 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
1f4a0 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
1f4b0 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
1f4c0 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
1f4d0 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
1f4e0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
1f4f0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
1f500 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1f510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f520 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
1f530 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
1f540 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
1f550 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f570 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
1f580 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1f590 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
1f5a0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1f5b0 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
1f5c0 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ad);.          i
1f5d0 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
1f5e0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1f5f0 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
1f600 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1f610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f620 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
1f630 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
1f640 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
1f650 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
1f660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1f670 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f680 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f690 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1f6a0 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20           amt -= 
1f6b0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  a;.          pBu
1f6c0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  f += a;.        
1f6d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f6e0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1f6f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1f700 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1f710 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f720 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
1f730 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1f740 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1f750 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
1f760 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
1f770 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
1f780 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
1f790 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
1f7a0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
1f7b0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
1f7c0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1f7d0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1f7e0 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
1f7f0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
1f800 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a   to a valid row.
1f810 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ** in the table.
1f820 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1f830 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1f840 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1f850 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
1f860 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
1f870 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
1f880 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1f890 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1f8a0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1f8b0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
1f8c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f8d0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
1f8e0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1f8f0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1f900 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
1f910 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f920 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1f930 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1f940 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1f950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1f960 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1f970 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1f980 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
1f990 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1f9a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1f9b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1f9c0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1f9d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
1f9e0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
1f9f0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
1fa00 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
1fa10 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
1fa20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1fa30 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
1fa40 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1fa50 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1fa60 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1fa70 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1fa80 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1fa90 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1faa0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1fab0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1fac0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1fad0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1fae0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1faf0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1fb00 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1fb10 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1fb20 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1fb30 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1fb40 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1fb50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1fb60 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
1fb70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1fb80 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1fb90 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1fba0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fbb0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1fbc0 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
1fbd0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1fbe0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
1fbf0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
1fc00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1fc10 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1fc20 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1fc30 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1fc40 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1fc50 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1fc60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1fc70 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1fc80 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1fc90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1fca0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1fcb0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1fcc0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1fcd0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1fce0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1fcf0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1fd00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1fd10 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1fd20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1fd30 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1fd40 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
1fd50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fd60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1fd70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
1fd80 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
1fd90 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
1fda0 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
1fdb0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1fdc0 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
1fdd0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
1fde0 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
1fdf0 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
1fe00 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
1fe10 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1fe20 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
1fe30 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
1fe40 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1fe50 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
1fe60 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
1fe70 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
1fe80 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
1fe90 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
1fea0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
1feb0 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
1fec0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
1fed0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
1fee0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
1fef0 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
1ff00 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
1ff10 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
1ff20 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
1ff30 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
1ff40 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
1ff50 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
1ff60 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
1ff70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1ff80 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
1ff90 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
1ffa0 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
1ffb0 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
1ffc0 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
1ffd0 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
1ffe0 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
1fff0 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
20000 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
20010 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
20020 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
20030 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
20040 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
20050 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
20060 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
20070 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
20080 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
20090 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
200a0 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
200b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
200c0 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
200d0 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
200e0 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
200f0 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
20100 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
20110 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
20120 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
20130 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
20140 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
20150 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
20160 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
20170 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
20180 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
20190 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
201a0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
201b0 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
201c0 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
201d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
201e0 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
201f0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
20200 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
20210 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
20220 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
20230 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
20240 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
20250 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
20260 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
20270 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
20280 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20290 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
202a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
202b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
202c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
202d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
202e0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
202f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20300 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
20310 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20320 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
20330 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e  nCell );.  if( N
20340 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  EVER(pCur->info.
20350 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20  nSize==0) ){.   
20360 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
20370 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20380 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  r->iPage], pCur-
20390 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
203a0 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
203b0 20 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69          &pCur->i
203c0 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79  nfo);.  }.  aPay
203d0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
203e0 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
203f0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
20400 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
20410 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
20420 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
20430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
20440 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
20450 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
20460 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
20470 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
20480 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
20490 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
204a0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
204b0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
204c0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
204d0 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  cal;.    assert(
204e0 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b   nLocal<=nKey );
204f0 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
20500 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
20510 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
20520 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
20530 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
20540 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
20550 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
20560 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
20570 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
20580 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
20590 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
205a0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
205b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
205c0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
205d0 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
205e0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
205f0 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
20600 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
20610 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
20620 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
20630 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
20640 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
20650 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
20660 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
20670 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
20680 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
20690 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
206a0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
206b0 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
206c0 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
206d0 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
206e0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
206f0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
20700 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
20710 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
20720 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
20730 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
20740 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
20750 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
20760 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
20770 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
20780 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
20790 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
207a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20  const void *p = 
207b0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
207c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
207d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
207e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
207f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20800 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20810 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
20820 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
20830 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
20840 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  p = (const void*
20850 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
20860 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
20870 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
20880 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
20890 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
208a0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
208b0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
208c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20  const void *p = 
208d0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
208e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
208f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
20900 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
20910 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20920 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20930 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
20940 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
20950 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
20960 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  p = (const void*
20970 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
20980 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
20990 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
209a0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
209b0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
209c0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
209d0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
209e0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
209f0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
20a00 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
20a10 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
20a20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20a30 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
20a40 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
20a50 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
20a60 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
20a70 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
20a80 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
20a90 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
20aa0 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
20ab0 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
20ac0 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
20ad0 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
20ae0 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
20af0 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
20b00 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
20b10 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
20b20 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
20b30 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
20b40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
20b50 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65   i = pCur->iPage
20b60 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
20b70 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  wPage;.  BtShare
20b80 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
20b90 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
20ba0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
20bb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
20bc0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20bd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20be0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20bf0 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
20c00 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69  MAX_DEPTH );.  i
20c10 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
20c20 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
20c30 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
20c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20c50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
20c60 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
20c70 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
20c80 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20  , &pNewPage);.  
20c90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20ca0 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61  rc;.  pCur->apPa
20cb0 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61  ge[i+1] = pNewPa
20cc0 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ge;.  pCur->aiId
20cd0 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43  x[i+1] = 0;.  pC
20ce0 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20  ur->iPage++;..  
20cf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
20d00 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
20d10 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
20d20 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
20d30 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65  ll<1 || pNewPage
20d40 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
20d50 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65  apPage[i]->intKe
20d60 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
20d70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20d80 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
20d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20da0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
20db0 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
20dc0 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
20dd0 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
20de0 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
20df0 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
20e00 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
20e10 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
20e20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
20e30 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
20e40 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
20e50 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
20e60 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
20e70 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
20e80 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
20e90 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
20ea0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
20eb0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
20ec0 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
20ed0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
20ee0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
20ef0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
20f00 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
20f10 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65   iChild){.  asse
20f20 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
20f30 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
20f40 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
20f50 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
20f60 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
20f70 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
20f80 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
20f90 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
20fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
20fb0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
20fc0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
20fd0 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
20fe0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
20ff0 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
21000 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
21010 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
21020 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21030 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
21040 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
21050 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
21060 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
21070 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
21080 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
21090 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
210a0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
210b0 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
210c0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
210d0 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
210e0 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
210f0 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
21100 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
21110 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
21120 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
21130 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
21140 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
21150 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21160 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21170 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21180 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21190 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
211a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
211b0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
211c0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
211d0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
211e0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
211f0 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
21200 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21210 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
21220 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21230 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
21240 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21250 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
21260 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
21270 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21280 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
21290 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
212a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
212b0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
212c0 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  NKey = 0;.}../*.
212d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
212e0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
212f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
21300 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
21310 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
21320 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
21330 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
21340 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
21350 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
21360 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
21370 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
21380 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
21390 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
213a0 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
213b0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
213c0 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
213d0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
213e0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
213f0 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
21400 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
21410 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
21420 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
21430 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
21440 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
21450 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
21460 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
21470 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
21480 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
21490 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
214a0 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
214b0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
214c0 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
214d0 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
214e0 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
214f0 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
21500 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
21510 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
21520 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
21530 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
21540 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
21550 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
21560 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
21570 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
21580 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
21590 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
215a0 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
215b0 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
215c0 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
215d0 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
215e0 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
215f0 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
21600 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
21610 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
21620 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
21630 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
21640 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
21650 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
21660 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
21670 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
21680 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
21690 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
216a0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
216b0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
216c0 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
216d0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
216e0 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
216f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
21700 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
21710 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
21720 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
21730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21740 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
21750 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
21760 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21770 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
21780 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21790 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
217a0 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
217b0 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
217c0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
217d0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
217e0 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
217f0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
21800 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
21810 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
21820 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
21830 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
21840 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
21850 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
21860 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21870 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
21880 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
21890 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
218a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
218b0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
218c0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
218d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
218e0 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
218f0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
21900 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
21910 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
21920 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =1; i<=pCur->iPa
21930 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
21940 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
21950 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
21960 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
21970 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
21980 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
21990 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
219a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
219b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29  pCur->apPage[0])
219c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
219d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
219e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
219f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
21a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21a10 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
21a20 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  >iPage = 0;..   
21a30 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
21a40 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
21a50 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
21a60 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
21a70 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a  his cursor.    *
21a80 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70  * expected to op
21a90 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65  en it on an inde
21aa0 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77  x b-tree. Otherw
21ab0 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f  ise, if pKeyInfo
21ac0 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c   is.    ** NULL,
21ad0 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
21ae0 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
21af0 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
21b00 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20  ot the case,.   
21b10 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
21b20 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
21b30 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  or.  */.    asse
21b40 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
21b50 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  [0]->intKey==1 |
21b60 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  | pCur->apPage[0
21b70 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  ]->intKey==0 );.
21b80 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70      if( (pCur->p
21b90 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75  KeyInfo==0)!=pCu
21ba0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
21bb0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
21bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
21bd0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
21be0 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74    }..  /* Assert
21bf0 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70   that the root p
21c00 61 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f  age is of the co
21c10 72 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73  rrect type. This
21c20 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a   must be the.  *
21c30 2a 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61  * case as the ca
21c40 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
21c50 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20  ion that loaded 
21c60 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65  the root-page (e
21c70 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20  ither.  ** this 
21c80 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f  call or a previo
21c90 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77  us invocation) w
21ca0 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
21cb0 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20  ed corruption . 
21cc0 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d   ** if the assum
21cd0 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ption were not t
21ce0 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e  rue, and it is n
21cf0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
21d00 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20  the flags .  ** 
21d10 62 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65  byte to have bee
21d20 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65  n modified while
21d30 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20   this cursor is 
21d40 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
21d50 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  nce.  ** to the 
21d60 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f  page.  */.  pRoo
21d70 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
21d80 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
21d90 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
21da0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20  ->pgnoRoot );.  
21db0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
21dc0 73 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e  sInit && (pCur->
21dd0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52  pKeyInfo==0)==pR
21de0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a  oot->intKey );..
21df0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
21e00 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
21e10 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
21e20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
21e30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
21e40 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Key = 0;..  if( 
21e50 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pRoot->nCell==0 
21e60 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  && !pRoot->leaf 
21e70 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
21e80 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
21e90 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
21ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
21eb0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
21ec0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
21ed0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
21ee0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
21ef0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
21f00 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
21f10 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
21f20 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
21f30 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
21f40 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
21f50 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e  tate = ((pRoot->
21f60 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
21f70 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
21f80 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ALID);.  }.  ret
21f90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21fa0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21fb0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
21fc0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
21fd0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
21fe0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
21ff0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
22000 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
22010 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
22020 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
22030 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
22040 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
22050 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
22060 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
22070 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
22080 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
22090 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
220a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
220b0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
220c0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
220d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
220e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
220f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22100 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22110 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
22120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22130 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
22140 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22150 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
22160 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22170 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22180 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
22190 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
221a0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
221b0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
221c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
221d0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
221e0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
221f0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
22200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22210 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
22220 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
22230 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
22240 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
22250 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
22260 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
22270 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
22280 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
22290 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
222a0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
222b0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
222c0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
222d0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
222e0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
222f0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
22300 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
22310 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
22320 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
22330 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
22340 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
22350 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
22360 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
22370 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
22380 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
22390 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
223a0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
223b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
223c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
223d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
223e0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
223f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22400 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
22410 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
22420 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22430 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22440 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22450 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22460 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
22470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22480 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
22490 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
224a0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
224b0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
224c0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
224d0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
224e0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
224f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22500 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
22510 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
22520 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
22530 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pgno);.  }.  if(
22540 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22550 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
22560 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
22570 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
22580 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
22590 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
225a0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
225b0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
225c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
225d0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
225e0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
225f0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
22600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
22610 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
22620 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
22630 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
22640 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
22650 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
22660 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
22670 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
22680 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
22690 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
226a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
226b0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
226c0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
226d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
226e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
226f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22700 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
22710 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
22720 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
22730 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
22740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22750 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
22760 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
22770 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
22780 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22790 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
227a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
227b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
227c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
227d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
227e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
227f0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
22800 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
22810 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
22820 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
22830 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22840 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
22850 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
22860 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
22870 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
22880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
22890 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
228a0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
228b0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
228c0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
228d0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
228e0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
228f0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
22900 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
22910 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
22920 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
22930 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
22940 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
22950 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22960 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
22970 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
22980 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
22990 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
229a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
229b0 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
229c0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
229d0 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
229e0 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
229f0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
22a00 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
22a10 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a  pCur->atLast ){.
22a20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
22a30 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
22a40 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
22a50 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
22a60 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
22a70 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
22a80 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
22a90 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
22aa0 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
22ab0 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
22ac0 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
22ad0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
22ae0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
22af0 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
22b00 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
22b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22b20 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
22b30 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
22b40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22b50 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
22b60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22b70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22b80 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
22b90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
22ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22bb0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
22bc0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
22bd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22be0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
22bf0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
22c00 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
22c10 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22c20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22c30 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
22c40 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
22c50 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
22c60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22c70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22c80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
22c90 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
22ca0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
22cb0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
22cc0 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20     pCur->atLast 
22cd0 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  = rc==SQLITE_OK 
22ce0 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ?1:0;.    }.  }.
22cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22d00 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
22d10 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
22d20 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
22d30 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
22d40 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
22d50 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
22d60 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
22d70 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
22d80 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
22d90 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
22da0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
22db0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
22dc0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
22dd0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
22de0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
22df0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
22e00 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
22e10 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
22e20 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
22e30 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
22e40 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
22e50 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
22e60 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
22e70 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
22e80 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
22e90 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
22ea0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
22eb0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
22ec0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
22ed0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
22ee0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
22ef0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
22f00 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
22f10 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
22f20 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
22f30 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
22f40 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
22f50 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
22f60 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
22f70 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
22f80 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
22f90 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
22fa0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
22fb0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
22fc0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
22fd0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
22fe0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
22ff0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
23000 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
23010 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
23020 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
23030 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
23040 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
23050 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
23060 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
23070 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
23080 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
23090 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
230a0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
230b0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
230c0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
230e0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
230f0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
23100 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
23110 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
23120 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
23130 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
23140 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
23150 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
23160 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
23170 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
23180 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
23190 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
231a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
231b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
231c0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
231d0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
231e0 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
231f0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
23200 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
23210 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
23220 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
23230 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
23240 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
23250 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
23260 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
23270 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
23280 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
23290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
232a0 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
232b0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
232c0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
232d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
232e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
232f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
23300 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
23310 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
23320 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
23330 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
23340 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
23350 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
23360 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
23370 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
23380 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
23390 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
233a0 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
233b0 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
233c0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
233d0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
233e0 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
233f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23400 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
23410 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20  ->validNKey .   
23420 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
23430 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
23440 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
23450 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
23460 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
23470 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
23480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
23490 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
234a0 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
234b0 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
234c0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
234d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
234e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
234f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
23500 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
23510 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23520 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23530 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
23540 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23550 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
23560 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
23570 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
23580 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
23590 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
235a0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
235b0 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ll>0 || pCur->eS
235c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
235d0 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
235e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
235f0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
23600 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
23610 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23620 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23630 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
23640 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23650 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
23660 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
23670 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
23680 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
23690 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
236a0 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f  r, upr;.    Pgno
236b0 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
236c0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
236d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
236e0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
236f0 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   c;..    /* pPag
23700 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
23710 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
23720 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
23730 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
23740 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
23750 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
23760 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
23770 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
23780 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
23790 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
237a0 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
237b0 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
237c0 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
237d0 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
237e0 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
237f0 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
23800 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
23810 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
23820 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
23830 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
23840 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
23850 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
23860 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
23870 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
23880 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
23890 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
238a0 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
238b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
238c0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
238d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
238e0 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
238f0 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
23900 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
23910 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
23920 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b  if( biasRight ){
23930 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
23940 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
23950 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20  = (u16)upr;.    
23960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
23970 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23980 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75  Page] = (u16)((u
23990 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20  pr+lwr)/2);.    
239a0 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  }.    for(;;){. 
239b0 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
239c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
239d0 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65  >iPage]; /* Inde
239e0 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c  x of current cel
239f0 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  l in pPage */.  
23a00 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
23a30 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
23a40 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
23a50 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
23a60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
23a70 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
23a80 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
23a90 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
23aa0 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
23ab0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
23ac0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
23ad0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  llKey;.        i
23ae0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
23af0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
23b00 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
23b10 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
23b20 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
23b30 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
23b40 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
23b50 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
23b60 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
23b70 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
23b80 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
23b90 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
23ba0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
23bb0 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
23bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
23bd0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
23be0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
23bf0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  sert( nCellKey>i
23c00 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
23c10 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
23c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75     }.        pCu
23c30 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
23c40 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
23c50 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
23c60 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lKey;.      }els
23c70 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
23c80 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
23c90 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
23ca0 20 33 32 37 36 38 20 62 79 74 65 73 2e 20 54 68   32768 bytes. Th
23cb0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
23cc0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
23cd0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
23ce0 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
23cf0 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
23d00 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
23d10 20 70 61 67 65 20 69 73 20 61 74 20 6d 6f 73 74   page is at most
23d20 20 38 31 39 38 20 62 79 74 65 73 2c 20 77 68 69   8198 bytes, whi
23d30 63 68 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  ch may be stored
23d40 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
23d50 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
23d60 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
23d70 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
23d80 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
23d90 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
23da0 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
23db0 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
23dc0 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
23dd0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
23de0 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
23df0 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
23e00 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
23e10 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
23e20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
23e30 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
23e40 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
23e50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
23e60 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b  t nCell = pCell[
23e70 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
23e80 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20  !(nCell & 0x80) 
23e90 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  && nCell<=pPage-
23ea0 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
23eb0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
23ec0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
23ed0 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
23ee0 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
23ef0 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
23f00 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
23f10 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
23f20 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
23f30 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
23f40 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
23f50 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
23f60 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
23f70 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
23f80 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
23f90 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
23fa0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
23fb0 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
23fc0 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
23fd0 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
23fe0 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
23ff0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
24000 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
24010 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
24020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
24030 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
24040 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
24050 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
24060 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
24070 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
24080 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
24090 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
240a0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
240b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
240c0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
240d0 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
240e0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
240f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
24100 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
24110 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
24120 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
24130 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
24140 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
24150 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
24160 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
24170 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
24180 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
24190 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
241a0 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
241b0 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
241c0 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
241d0 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
241e0 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
241f0 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
24200 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20  be called. */.  
24210 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
24220 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
24230 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
24240 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
24250 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
24260 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
24270 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
24280 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
24290 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
242a0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
242b0 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
242c0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
242d0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
242e0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
242f0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
24300 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
24310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24330 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
24340 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
24350 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
24360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
24370 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
24380 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
24390 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
243a0 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
243b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
243c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
243d0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
243e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
243f0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
24400 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24410 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
24420 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
24430 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
24440 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
24450 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24460 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
24470 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24480 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
24490 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
244a0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
244b0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
244c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
244d0 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
244e0 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
244f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
24500 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24510 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
24520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
24530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24540 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
24550 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
24560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24570 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
24580 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
24590 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
245a0 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
245b0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
245c0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
245d0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
245e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
245f0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
24600 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
24610 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b  6)((lwr+upr)/2);
24620 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
24630 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
24640 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24650 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
24660 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
24670 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
24680 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
24690 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
246a0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
246b0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
246c0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
246d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
246e0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
246f0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
24700 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
24710 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
24720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
24730 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
24740 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
24750 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24760 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
24770 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24780 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ll );.      *pRe
24790 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
247a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
247b0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
247c0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
247d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
247e0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
247f0 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e  )lwr;.    pCur->
24800 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
24810 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
24820 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
24830 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
24840 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
24850 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
24860 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
24870 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
24880 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24890 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
248a0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
248b0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
248c0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
248d0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
248e0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
248f0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
24900 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
24910 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
24920 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
24930 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
24940 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
24950 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
24960 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
24970 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
24980 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
24990 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
249a0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
249b0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
249c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
249d0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
249e0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
249f0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
24a00 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
24a10 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
24a20 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
24a30 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
24a40 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
24a50 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
24a60 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
24a70 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
24a80 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
24a90 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
24aa0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
24ab0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
24ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
24ad0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
24ae0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
24af0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
24b00 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
24b10 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
24b20 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
24b30 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
24b40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
24b50 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
24b60 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
24b70 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
24b80 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
24b90 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
24ba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24bb0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
24bc0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
24bd0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
24be0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
24bf0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
24c00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24c10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24c20 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
24c30 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
24c40 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
24c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24c60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24c70 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
24c80 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   );.  if( CURSOR
24c90 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
24ca0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
24cb0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
24cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24cd0 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
24ce0 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
24cf0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
24d00 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
24d10 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
24d20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
24d30 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
24d40 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
24d50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24d60 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
24d70 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
24d80 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
24d90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
24da0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
24db0 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e  t( idx<=pPage->n
24dc0 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
24dd0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
24de0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
24df0 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64  ey = 0;.  if( id
24e00 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
24e10 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
24e20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
24e30 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24e40 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
24e50 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
24e60 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
24e70 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
24e80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
24e90 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
24ea0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
24eb0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
24ec0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
24ed0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
24ee0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
24ef0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
24f00 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
24f10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
24f20 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
24f30 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
24f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
24f60 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
24f70 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
24f80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24f90 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
24fa0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
24fb0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24fc0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
24fd0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
24fe0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
24ff0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
25000 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25010 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
25020 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25030 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25040 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
25050 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
25060 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
25070 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
25080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25090 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
250a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
250b0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
250c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
250d0 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
250e0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
250f0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
25100 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
25110 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
25120 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
25130 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
25140 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
25150 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
25160 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
25170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
25180 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
25190 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
251a0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
251b0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
251c0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
251d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
251e0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
251f0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
25200 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
25210 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25220 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
25230 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
25240 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
25250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25260 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
25270 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
25280 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
25290 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
252a0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
252b0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
252c0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
252d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
252e0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
252f0 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  t<0 ){.    pCur-
25300 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
25310 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
25320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25330 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
25340 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20  skipNext = 0;.. 
25350 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
25360 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25370 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
25380 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
25390 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
253a0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
253b0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
253c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
253d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
253e0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
253f0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
25400 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
25410 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
25420 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
25430 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
25440 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
25450 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
25460 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
25470 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
25480 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
25490 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
254a0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
254b0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
254c0 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
254d0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
254e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
254f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
25500 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
25510 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
25520 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
25530 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
25540 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20  idNKey = 0;..   
25550 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25560 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
25570 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
25580 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25590 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
255a0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
255b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
255c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
255d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
255e0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
255f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
25600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
25610 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
25620 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25630 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
25640 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
25650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25660 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
25670 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
25680 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
25690 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
256a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
256b0 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
256c0 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
256d0 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
256e0 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
256f0 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
25700 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
25710 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
25720 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
25730 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
25740 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
25750 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
25760 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
25770 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
25780 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
25790 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
257a0 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
257b0 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
257c0 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
257d0 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
257e0 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
257f0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
25800 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
25810 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
25820 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
25830 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
25840 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
25850 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
25860 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
25870 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20  s not 0, then a 
25880 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20  (feeble) effort 
25890 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
258a0 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
258b0 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
258c0 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
258d0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
258e0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
258f0 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
25900 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
25910 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
25920 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25930 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
25940 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
25950 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
25960 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
25970 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65  e "exact" parame
25980 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e  ter is not 0, an
25990 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  d the page-numbe
259a0 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20  r nearby exists 
259b0 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
259c0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
259d0 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e  hen it is guaren
259e0 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
259f0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ned. This.** is 
25a00 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74  only used by aut
25a10 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
25a20 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  es when allocati
25a30 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a  ng a new table..
25a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
25a50 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
25a60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
25a70 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  , .  MemPage **p
25a80 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a  pPage, .  Pgno *
25a90 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e  pPgno, .  Pgno n
25aa0 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63  earby,.  u8 exac
25ab0 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
25ac0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
25ad0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
25ae0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
25af0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
25b00 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
25b10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
25b20 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
25b30 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
25b40 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
25b50 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
25b60 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
25b70 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
25b80 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
25b90 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
25ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25bb0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
25bc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
25bd0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
25be0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
25bf0 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
25c00 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
25c10 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34  pBt);.  n = get4
25c20 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
25c30 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
25c40 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
25c50 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
25c60 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
25c70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25c80 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
25c90 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
25ca0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
25cb0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
25cc0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
25cd0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
25ce0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
25cf0 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
25d00 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
25d10 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
25d20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
25d30 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
25d40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
25d50 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
25d60 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
25d70 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
25d80 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
25d90 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
25da0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
25db0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
25dc0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
25dd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
25de0 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
25df0 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
25e00 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
25e10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25e20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
25e30 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
25e40 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
25e50 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
25e60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
25e70 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
25e80 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
25e90 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
25ea0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
25eb0 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
25ec0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
25ed0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
25ee0 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
25ef0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
25f00 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
25f10 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
25f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
25f30 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
25f40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
25f50 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
25f60 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
25f70 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
25f80 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
25f90 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
25fa0 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
25fb0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
25fc0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
25fd0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
25fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25ff0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
26000 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
26010 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
26020 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
26030 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
26040 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
26050 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
26060 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
26070 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
26080 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
26090 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
260a0 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
260b0 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
260c0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
260d0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
260e0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
260f0 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
26100 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
26110 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
26120 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
26130 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
26140 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
26150 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
26160 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
26170 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
26180 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
26190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
261a0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
261b0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
261c0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
261d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
261e0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
261f0 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
26200 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
26210 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
26220 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
26230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26240 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
26250 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
26260 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
26270 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
26280 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
26290 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
262a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
262b0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
262c0 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
262d0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
262e0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
262f0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
26300 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
26310 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
26320 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
26330 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
26340 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
26350 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
26360 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
26370 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
26380 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
26390 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
263a0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
263b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
263c0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
263d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
263e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
263f0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
26400 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
26410 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
26420 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
26430 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
26440 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
26450 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
26460 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
26470 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
26480 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
26490 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
264a0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
264b0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
264c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
264d0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
264e0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
264f0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
26500 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
26510 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26520 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
26530 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
26540 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
26550 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
26560 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
26570 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
26580 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26590 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
265a0 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
265b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
265c0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
265d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
265e0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
265f0 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
26600 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
26610 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
26620 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
26630 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
26640 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
26650 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
26660 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
26670 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
26680 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
26690 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
266a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
266b0 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
266c0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
266d0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
266e0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
266f0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
26700 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26710 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
26720 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
26730 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
26740 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
26750 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
26760 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
26770 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26780 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
26790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
267a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
267b0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
267c0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
267d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
267e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
267f0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
26800 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
26810 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
26820 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
26830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26840 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26850 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
26860 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
26870 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
26880 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
26890 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
268a0 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
268b0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
268c0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
268d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
268e0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
268f0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26900 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
26910 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
26920 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
26930 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
26940 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
26950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26960 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
26970 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
26980 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
26990 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
269a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
269b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
269c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
269d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
269e0 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
269f0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
26a00 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
26a10 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
26a20 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
26a30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26a40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26a50 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
26a60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
26a70 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
26a80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26a90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26aa0 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
26ab0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
26ac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26ad0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
26ae0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
26af0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
26b00 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
26b10 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
26b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26b30 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
26b40 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
26b50 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
26b60 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
26b70 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
26b80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
26b90 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
26ba0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
26bb0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
26bc0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
26bd0 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
26be0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26bf0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
26c00 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
26c10 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
26c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
26c30 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
26c40 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
26c50 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
26c60 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
26c70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
26c80 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
26c90 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26cb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26cc0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
26cd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
26ce0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
26d00 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26d10 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
26d20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
26d30 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
26d40 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
26d50 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
26d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26d70 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
26d80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
26d90 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
26da0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
26db0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
26dc0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
26dd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
26de0 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
26df0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
26e00 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
26e10 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
26e20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
26e30 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
26e40 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
26e50 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
26e60 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
26e70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
26e80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26e90 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
26ea0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
26ec0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
26ed0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
26ee0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
26ef0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
26f00 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
26f10 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
26f20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
26f30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
26f40 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
26f50 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
26f60 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
26f70 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
26f80 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
26f90 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
26fa0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
26fb0 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
26fc0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
26fd0 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
26fe0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
26ff0 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
27000 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
27010 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
27020 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
27030 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
27040 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
27050 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27080 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
27090 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
270a0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
270b0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
270c0 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
270d0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
270e0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
270f0 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
27100 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
27110 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
27120 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
27130 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
27140 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
27150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
27160 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
27170 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
27180 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
27190 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
271a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
271b0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
271c0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
271d0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
271e0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
271f0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
27200 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
27210 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
27220 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
27230 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
27240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27250 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
27260 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
27270 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
27280 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
27290 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
272a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
272b0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
272c0 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
272d0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
272e0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
272f0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
27300 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -1);.          a
27310 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
27320 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
27330 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20  Trunk->pDbPage) 
27340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
27350 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
27360 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
27370 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20  , *pPgno);.     
27380 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
27390 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
273a0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
273b0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
273c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
273d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
273e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
273f0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
27400 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
27410 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
27420 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
27440 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
27450 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27460 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
27470 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
27480 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
27490 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
274a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
274b0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
274c0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
274d0 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
274e0 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
274f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
27500 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
27510 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
27520 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
27530 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
27540 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
27550 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
27560 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
27570 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
27580 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
27590 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
275a0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
275b0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
275c0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
275d0 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
275e0 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
275f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
27600 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
27610 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
27620 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
27630 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
27640 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
27650 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
27660 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
27670 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
27680 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
27690 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
276a0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
276b0 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
276c0 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
276d0 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
276e0 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
276f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
27700 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
27710 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
27720 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
27730 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
27740 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
27750 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
27760 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
27770 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
27780 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
27790 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
277a0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
277b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
277c0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
277d0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
277e0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
277f0 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
27800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27810 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
27820 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27830 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
27840 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
27850 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
27860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27870 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
27880 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
27890 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
278a0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
278b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
278c0 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
278d0 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
278e0 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
278f0 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
27900 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
27910 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
27920 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
27930 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
27940 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
27950 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
27960 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
27970 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
27980 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  gno, ppPage, 1);
27990 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
279a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
279b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
279c0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
279d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
279e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
279f0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
27a00 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
27a10 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
27a20 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
27a30 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
27a40 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
27a50 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
27a60 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
27a70 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
27a80 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
27a90 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
27aa0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
27ab0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
27ac0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
27ae0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
27af0 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
27b00 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
27b10 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
27b20 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
27b30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27b40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
27b60 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
27b70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
27b80 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
27b90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27ba0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
27bb0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
27bc0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
27bd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
27be0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
27bf0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
27c00 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
27c10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
27c20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
27c30 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
27c40 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
27c50 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
27c60 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
27c70 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
27c80 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
27c90 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
27ca0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
27cb0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
27cc0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
27cd0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
27ce0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
27cf0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
27d00 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
27d10 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
27d20 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
27d30 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
27d40 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
27d50 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
27d60 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
27d70 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
27d80 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
27d90 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
27da0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
27db0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
27dc0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
27dd0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
27de0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
27df0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
27e00 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27e20 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
27e30 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
27e40 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e60 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
27e70 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
27e80 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
27e90 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
27ea0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
27eb0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
27ec0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
27ed0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ef0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
27f00 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
27f10 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
27f20 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f40 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
27f50 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
27f80 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
27f90 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
27fa0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
27fb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27fc0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
27fd0 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
27fe0 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
27ff0 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
28000 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
28010 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
28020 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
28030 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
28040 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
28050 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
28060 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
28070 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
28080 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
28090 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
280a0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
280b0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
280c0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
280d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
280e0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
280f0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
28100 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
28110 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
28120 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
28130 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
28140 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
28150 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
28160 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
28170 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
28180 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
28190 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
281a0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
281b0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
281c0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
281d0 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
281e0 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
281f0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
28200 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
28210 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
28220 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
28230 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
28240 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
28250 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
28260 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
28270 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
28280 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
28290 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
282a0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
282b0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
282c0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
282d0 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
282e0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
282f0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
28300 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
28310 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
28320 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
28330 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
28340 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
28350 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
28360 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
28370 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
28380 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
28390 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
283a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
283b0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
283c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
283d0 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
283e0 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
283f0 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
28400 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
28410 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
28420 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
28430 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
28440 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
28450 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
28460 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
28470 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
28480 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
28490 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
284a0 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
284b0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
284c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
284d0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
284e0 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
284f0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
28500 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
28510 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
28520 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
28530 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
28540 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
28550 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
28560 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
28570 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
28580 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
285a0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
285b0 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
285c0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
285d0 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
285e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
285f0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
28600 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
28610 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
28620 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
28630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28640 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
28650 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
28660 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
28670 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
28680 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
28690 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
286a0 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
286b0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
286c0 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
286d0 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
286e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
286f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28700 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
28710 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
28720 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
28730 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
28740 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
28750 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
28760 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
28770 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
28780 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
28790 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
287a0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
287b0 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
287c0 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
287d0 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
287e0 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
287f0 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
28800 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
28810 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
28820 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
28830 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
28840 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
28850 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
28860 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
28870 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
28880 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
28890 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
288a0 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
288b0 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
288c0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
288d0 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
288e0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
288f0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
28900 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
28910 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
28920 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
28930 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
28940 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
28950 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
28960 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
28970 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
28980 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
28990 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
289a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
289b0 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
289c0 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
289d0 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
289e0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
289f0 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
28a00 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
28a10 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
28a20 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
28a30 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
28a40 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
28a50 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
28a60 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
28a70 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
28a80 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
28a90 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
28aa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
28ab0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28ac0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
28ad0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
28ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28af0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
28b00 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
28b10 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
28b20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
28b30 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
28b40 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
28b50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
28b60 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e 73 65  Page && !pBt->se
28b70 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
28b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
28b90 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
28ba0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
28bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28bc0 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
28bd0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
28be0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
28bf0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
28c00 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
28c10 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
28c20 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
28c30 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
28c40 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
28c50 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
28c60 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
28c70 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
28c80 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
28c90 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
28ca0 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
28cb0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
28cc0 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
28cd0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
28ce0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
28cf0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
28d00 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
28d10 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
28d20 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
28d30 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
28d40 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
28d50 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
28d60 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
28d70 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
28d80 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
28d90 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
28da0 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
28db0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
28dc0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
28dd0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
28de0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
28df0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
28e00 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
28e10 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
28e20 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
28e30 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
28e40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
28e50 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
28e60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28e70 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
28e80 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
28e90 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
28ea0 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
28eb0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
28ec0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
28ed0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
28ee0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
28ef0 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
28f00 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
28f10 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
28f20 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
28f30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
28f40 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
28f50 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
28f60 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
28f70 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
28f80 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
28f90 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
28fa0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
28fb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
28fc0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
28fd0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
28fe0 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
28ff0 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
29000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
29010 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
29020 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
29030 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
29040 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
29050 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
29060 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
29070 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
29080 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
29090 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
290a0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
290b0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
290c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
290d0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
290e0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
290f0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
29100 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
29110 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20  nt nOvfl;.  u16 
29120 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
29130 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29140 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
29150 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
29160 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
29170 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
29180 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
29190 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
291a0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
291b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
291c0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
291d0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
291e0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
291f0 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
29200 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
29210 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
29220 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
29230 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
29240 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
29250 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
29260 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
29270 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
29280 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
29290 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
292a0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
292b0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
292c0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
292d0 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
292e0 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
292f0 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
29300 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
29310 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
29320 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
29330 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
29340 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
29350 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
29360 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
29370 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
29380 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
29390 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
293a0 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
293b0 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
293c0 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
293d0 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
293e0 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
293f0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
29400 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
29410 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29420 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
29430 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
29440 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
29450 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
29460 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
29470 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
29480 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
29490 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
294a0 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
294b0 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
294c0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
294d0 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
294e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
294f0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
29500 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
29510 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
29520 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
29530 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
29540 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
29550 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
29560 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
29570 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
29580 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
29590 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
295a0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
295b0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
295c0 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
295d0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
295e0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
295f0 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
29600 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
29610 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
29620 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
29630 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
29640 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
29650 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
29660 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
29670 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
29680 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
29690 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
296a0 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
296b0 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
296c0 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
296d0 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
296e0 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
296f0 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
29700 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
29710 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
29720 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
29730 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
29740 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
29750 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
29760 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
29770 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
29780 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
29790 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
297a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
297b0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
297c0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
297d0 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
297e0 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
297f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
29800 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
29810 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
29820 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
29830 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
29840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29850 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
29860 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
29870 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29880 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
29890 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
298a0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
298b0 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
298c0 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
298d0 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
298e0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
298f0 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
29900 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
29910 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
29920 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
29930 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
29940 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
29950 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
29960 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
29970 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
29980 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
29990 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
299a0 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
299b0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
299c0 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
299d0 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
299e0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
299f0 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
29a00 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
29a10 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
29a20 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
29a30 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
29a40 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
29a50 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
29a60 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
29a70 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
29a80 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
29a90 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
29aa0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
29ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
29ac0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
29ad0 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
29ae0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
29af0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
29b00 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
29b10 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
29b20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
29b30 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
29b40 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
29b50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
29b60 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
29b70 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
29b80 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29ba0 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
29bb0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
29bc0 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
29bd0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
29be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
29bf0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
29c00 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
29c10 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
29c20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
29c30 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
29c40 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
29c50 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
29c60 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
29c70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
29c80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
29c90 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
29ca0 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
29cb0 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
29cc0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
29cd0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
29ce0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
29cf0 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
29d00 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
29d10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29d20 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
29d30 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
29d40 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
29d50 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
29d60 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
29d70 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
29d80 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
29d90 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
29da0 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
29db0 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
29dc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
29dd0 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
29de0 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
29df0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
29e00 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
29e10 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
29e20 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
29e30 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
29e40 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
29e50 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
29e60 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
29e70 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
29e80 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
29e90 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
29ea0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
29eb0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
29ec0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
29ed0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
29ee0 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
29ef0 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
29f00 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
29f10 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
29f20 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
29f30 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
29f40 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
29f50 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
29f60 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
29f70 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
29f80 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
29f90 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
29fa0 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
29fb0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
29fc0 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
29fd0 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
29fe0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
29ff0 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
2a000 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
2a010 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
2a020 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2a030 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2a040 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2a050 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
2a060 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
2a070 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66   NEVER(nKey>0x7f
2a080 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
2a090 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
2a0a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a0b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2a0c0 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
2a0d0 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
2a0e0 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
2a0f0 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
2a100 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
2a110 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
2a120 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
2a130 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
2a140 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
2a150 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
2a160 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2a170 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
2a180 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
2a190 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
2a1a0 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
2a1b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2a1c0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
2a1d0 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
2a1e0 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
2a1f0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2a200 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
2a210 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2a220 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2a230 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
2a240 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
2a250 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
2a260 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
2a270 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2a280 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
2a290 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
2a2a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2a2b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2a2c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2a2d0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2a2e0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
2a2f0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
2a300 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
2a310 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a320 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2a330 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2a340 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
2a350 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
2a360 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
2a370 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
2a380 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
2a390 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
2a3a0 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
2a3b0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2a3c0 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
2a3d0 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
2a3e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2a3f0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
2a400 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
2a410 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
2a420 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
2a430 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
2a440 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
2a450 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
2a460 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
2a470 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
2a480 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
2a490 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
2a4a0 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
2a4b0 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
2a4c0 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
2a4d0 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
2a4e0 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
2a4f0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
2a500 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
2a510 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
2a520 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
2a530 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2a540 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2a550 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2a560 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
2a570 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
2a580 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
2a590 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
2a5a0 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
2a5b0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2a5c0 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
2a5d0 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
2a5e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2a5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2a600 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
2a610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a620 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2a630 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2a640 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2a650 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2a660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a670 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2a680 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
2a690 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
2a6a0 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
2a6b0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
2a6c0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
2a6d0 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
2a6e0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
2a6f0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2a700 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
2a710 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2a720 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2a730 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2a740 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2a750 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
2a760 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
2a770 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2a780 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2a790 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2a7a0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
2a7b0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2a7c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2a7d0 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
2a7e0 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
2a7f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2a800 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2a810 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2a820 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2a830 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2a840 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
2a850 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
2a860 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
2a870 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2a880 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
2a890 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
2a8a0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
2a8b0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
2a8c0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
2a8d0 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
2a8e0 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
2a8f0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
2a900 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
2a910 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2a920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
2a930 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
2a940 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
2a950 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
2a960 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2a970 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2a980 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
2a990 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
2a9a0 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
2a9b0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2a9c0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2a9d0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2a9e0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2a9f0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
2aa00 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2aa10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2aa20 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
2aa30 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
2aa40 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
2aa50 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
2aa60 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
2aa70 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
2aa80 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
2aa90 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2aaa0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2aab0 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
2aac0 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
2aad0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2aae0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2aaf0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2ab00 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ab10 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2ab20 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
2ab30 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
2ab40 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
2ab50 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
2ab60 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
2ab70 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
2ab80 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
2ab90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2aba0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
2abb0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
2abc0 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
2abd0 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
2abe0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
2abf0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
2ac00 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
2ac10 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
2ac20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
2ac30 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2ac40 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2ac50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
2ac60 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2ac70 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
2ac80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2ac90 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
2aca0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
2acb0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
2acc0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
2acd0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
2ace0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
2acf0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
2ad00 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
2ad10 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
2ad20 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
2ad30 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
2ad40 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
2ad50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
2ad60 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
2ad70 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2ad80 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
2ad90 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
2ada0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
2adb0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
2adc0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
2add0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
2ade0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2adf0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
2ae00 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74  int *pRC){.  int
2ae10 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
2ae20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2ae30 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
2ae40 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2ae50 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
2ae60 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
2ae70 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
2ae80 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
2ae90 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
2aea0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
2aeb0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
2aec0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
2aed0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2aee0 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
2aef0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2af00 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2af10 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
2af20 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
2af30 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
2af40 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
2af50 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2af60 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2af70 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
2af80 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
2af90 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2afa0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
2afb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2afc0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2afd0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2afe0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2aff0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b000 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2b010 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
2b020 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2b030 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
2b040 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2b050 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
2b060 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
2b070 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2b080 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
2b090 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
2b0a0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2b0b0 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
2b0c0 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
2b0d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2b0e0 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 67 65  );.  if( pc < ge
2b0f0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b100 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
2b110 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2b120 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
2b130 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
2b140 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
2b150 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
2b160 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
2b170 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
2b180 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
2b190 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2b1a0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64  ;.  }.  for(i=id
2b1b0 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
2b1c0 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
2b1d0 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
2b1e0 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
2b1f0 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
2b200 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
2b210 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
2b220 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
2b230 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
2b240 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
2b250 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2b260 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
2b270 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
2b280 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
2b290 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
2b2a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
2b2b0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
2b2c0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
2b2d0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
2b2e0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
2b2f0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
2b300 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
2b310 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
2b320 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
2b330 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
2b340 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
2b350 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
2b360 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
2b370 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
2b380 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
2b390 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  aOvfl[] and make
2b3a0 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
2b3b0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
2b3c0 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
2b3d0 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
2b3e0 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
2b3f0 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
2b400 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
2b410 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
2b420 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
2b430 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
2b440 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
2b450 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
2b460 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
2b470 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
2b480 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
2b490 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
2b4a0 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
2b4b0 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
2b4c0 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
2b4d0 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
2b4e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2b4f0 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
2b500 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2b510 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
2b520 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
2b530 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
2b540 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
2b550 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
2b560 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
2b570 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65  ic void insertCe
2b580 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
2b590 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
2b5a0 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
2b5b0 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
2b5c0 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
2b5d0 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
2b5e0 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
2b5f0 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
2b600 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
2b610 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2b620 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
2b630 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
2b640 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
2b650 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
2b660 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
2b670 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
2b680 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
2b690 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
2b6a0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f  needed */.  Pgno
2b6b0 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a   iChild,      /*
2b6c0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65   If non-zero, re
2b6d0 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79  place first 4 by
2b6e0 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61  tes with this va
2b6f0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  lue */.  int *pR
2b700 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  C          /* Re
2b710 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74  ad and write ret
2b720 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65  urn code from he
2b730 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
2b740 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  dx = 0;      /* 
2b750 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
2b760 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
2b770 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2b780 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
2b790 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2b7a0 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
2b7b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2b7c0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
2b7d0 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
2b7e0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2b7f0 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
2b800 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
2b810 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
2b820 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
2b830 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
2b840 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
2b850 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
2b860 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2b870 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
2b880 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
2b890 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
2b8a0 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
2b8b0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
2b8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2b8d0 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
2b8e0 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
2b8f0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69  n data[] */..  i
2b900 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69  nt nSkip = (iChi
2b910 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20  ld ? 4 : 0);..  
2b920 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
2b930 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  n;..  assert( i>
2b940 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
2b950 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
2b960 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
2b970 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2b980 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2b990 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2b9a0 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
2b9b0 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  60 );.  assert( 
2b9c0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b9d0 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
2b9e0 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61  e->aOvfl) );.  a
2b9f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2ba00 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2ba10 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2ba20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
2ba30 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
2ba40 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
2ba50 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
2ba60 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
2ba70 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
2ba80 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
2ba90 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
2baa0 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
2bab0 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
2bac0 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
2bad0 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64   4 but got round
2bae0 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68  ed up to 4 on th
2baf0 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a  e leaf, then siz
2bb00 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  e.  ** might be 
2bb10 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61  less than 8 (lea
2bb20 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72  f-size + pointer
2bb30 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f  ) on the interio
2bb40 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20  r node.  Hence. 
2bb50 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74   ** the term aft
2bb60 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65  er the || in the
2bb70 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
2bb80 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  t(). */.  assert
2bb90 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
2bba0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
2bbb0 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68  || (sz==8 && iCh
2bbc0 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20  ild>0) );.  if( 
2bbd0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2bbe0 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
2bbf0 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
2bc00 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
2bc10 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
2bc20 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
2bc30 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
2bc40 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
2bc50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2bc60 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
2bc70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
2bc80 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
2bc90 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
2bca0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
2bcb0 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
2bcc0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
2bcd0 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
2bce0 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  >aOvfl[0])) );. 
2bcf0 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
2bd00 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  j].pCell = pCell
2bd10 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
2bd20 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36  fl[j].idx = (u16
2bd30 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )i;.  }else{.   
2bd40 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2bd50 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2bd60 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2bd70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bd80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
2bd90 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
2bda0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
2bdb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2bdc0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2bdd0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2bde0 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
2bdf0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63  ge->aData;.    c
2be00 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
2be10 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
2be20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66     end = cellOff
2be30 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
2be40 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20  Cell;.    ins = 
2be50 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
2be60 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  ;.    rc = alloc
2be70 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
2be80 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69  sz, &idx);.    i
2be90 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20  f( rc ){ *pRC = 
2bea0 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  rc; return; }.  
2beb0 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74    /* The allocat
2bec0 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  eSpace() routine
2bed0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20   guarantees the 
2bee0 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72  following two pr
2bef0 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20  operties.    ** 
2bf00 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75  if it returns su
2bf10 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73  ccess */.    ass
2bf20 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b  ert( idx >= end+
2bf30 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
2bf40 20 69 64 78 2b 73 7a 20 3c 3d 20 70 50 61 67 65   idx+sz <= pPage
2bf50 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2bf60 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
2bf70 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
2bf80 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
2bf90 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
2bfa0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
2bfb0 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e  +nSkip], pCell+n
2bfc0 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
2bfd0 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
2bfe0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2bff0 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
2c000 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
2c010 20 66 6f 72 28 6a 3d 65 6e 64 2c 20 70 74 72 3d   for(j=end, ptr=
2c020 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
2c030 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
2c040 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
2c050 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
2c060 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
2c070 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
2c080 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
2c090 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
2c0a0 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
2c0b0 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61  drOffset+3], pPa
2c0c0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e  ge->nCell);.#ifn
2c0d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c0e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2c0f0 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
2c100 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2c110 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
2c120 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
2c130 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
2c140 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
2c150 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
2c160 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
2c170 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
2c180 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
2c190 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
2c1a0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
2c1b0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
2c1c0 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
2c1d0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
2c1e0 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f  .** Add a list o
2c1f0 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67  f cells to a pag
2c200 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f  e.  The page sho
2c210 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79  uld be initially
2c220 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63   empty..** The c
2c230 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74  ells are guarant
2c240 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  eed to fit on th
2c250 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
2c260 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50  c void assembleP
2c270 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
2c280 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20  pPage,   /* The 
2c290 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d  page to be assem
2c2a0 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  blied */.  int n
2c2b0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
2c2c0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  The number of ce
2c2d0 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68  lls to add to th
2c2e0 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  is page */.  u8 
2c2f0 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f  **apCell,      /
2c300 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65  * Pointers to ce
2c310 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75  ll bodies */.  u
2c320 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20  16 *aSize       
2c330 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65   /* Sizes of the
2c340 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69   cells */.){.  i
2c350 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2c360 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2c370 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   */.  u8 *pCellp
2c380 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  tr;     /* Addre
2c390 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
2c3a0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
2c3b0 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f   cellbody;     /
2c3c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
2c3d0 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20  t cell body */. 
2c3e0 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
2c3f0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c410 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  Pointer to data 
2c420 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63  for pPage */.  c
2c430 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
2c440 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2c450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2c460 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f  fset of header o
2c470 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  n pPage */.  con
2c480 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d  st int nUsable =
2c490 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2c4a0 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62  bleSize; /* Usab
2c4b0 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20  le size of page 
2c4c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
2c4d0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2c4e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2c4f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c500 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2c510 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2c520 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43  ( nCell>=0 && nC
2c530 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
2c540 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
2c550 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
2c560 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72  =5460 );.  asser
2c570 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2c580 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2c590 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2c5a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2c5b0 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74  he page has just
2c5c0 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20   been zeroed by 
2c5d0 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20  zeroPage() */.  
2c5e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2c5f0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
2c600 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64  ert( get2byte(&d
2c610 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
2c620 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
2c630 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
2c640 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
2c650 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c  nCell*2];.  cell
2c660 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a  body = nUsable;.
2c670 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b    for(i=nCell-1;
2c680 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2c690 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a   pCellptr -= 2;.
2c6a0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20      cellbody -= 
2c6b0 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75  aSize[i];.    pu
2c6c0 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
2c6d0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
2c6e0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
2c6f0 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
2c700 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20  ], aSize[i]);.  
2c710 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
2c720 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
2c730 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
2c740 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c  ata[hdr+5], cell
2c750 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
2c760 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a  nFree -= (nCell*
2c770 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65  2 + nUsable - ce
2c780 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2c790 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
2c7a0 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
2c7b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
2c7c0 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
2c7d0 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
2c7e0 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
2c7f0 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
2c800 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2c810 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
2c820 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
2c830 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2c840 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
2c850 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2c860 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
2c870 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2c880 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
2c890 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2c8a0 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
2c8b0 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
2c8c0 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
2c8d0 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
2c8e0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2c8f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
2c900 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
2c910 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
2c920 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
2c930 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
2c940 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
2c950 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
2c960 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
2c970 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
2c980 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
2c990 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
2c9a0 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
2c9b0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
2c9c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
2c9d0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
2c9e0 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
2c9f0 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
2ca00 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
2ca10 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
2ca20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ca30 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2ca40 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2ca50 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
2ca60 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
2ca70 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
2ca80 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
2ca90 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69   balance */...#i
2caa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2cab0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
2cac0 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
2cad0 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
2cae0 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
2caf0 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
2cb00 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
2cb10 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
2cb20 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
2cb30 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
2cb40 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
2cb50 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
2cb60 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
2cb70 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
2cb80 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
2cb90 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
2cba0 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
2cbb0 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e   trying to balan
2cbc0 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
2cbd0 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
2cbe0 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
2cbf0 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
2cc00 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
2cc10 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
2cc20 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
2cc30 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
2cc40 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
2cc50 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
2cc60 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
2cc70 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
2cc80 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
2cc90 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
2cca0 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
2ccb0 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
2ccc0 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
2ccd0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
2cce0 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
2ccf0 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
2cd00 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
2cd10 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
2cd20 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
2cd30 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
2cd40 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
2cd50 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
2cd60 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
2cd70 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
2cd80 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
2cd90 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
2cda0 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
2cdb0 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
2cdc0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
2cdd0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69   pSpace buffer i
2cde0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
2cdf0 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79  a temporary copy
2ce00 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a   of the divider.
2ce10 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c  ** cell that wil
2ce20 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
2ce30 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68  to pParent. Such
2ce40 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
2ce50 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20   of a 4.** byte 
2ce60 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  page number foll
2ce70 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62  owed by a variab
2ce80 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2ce90 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  r. In other.** w
2cea0 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33  ords, at most 13
2ceb0 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68   bytes. Hence th
2cec0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
2ced0 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65  must be at.** le
2cee0 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20  ast 13 bytes in 
2cef0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
2cf00 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
2cf10 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  k(MemPage *pPare
2cf20 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  nt, MemPage *pPa
2cf30 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b  ge, u8 *pSpace){
2cf40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e  .  BtShared *con
2cf50 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  st pBt = pPage->
2cf60 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65  pBt;    /* B-Tre
2cf70 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e Database */.  
2cf80 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20  MemPage *pNew;  
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
2cfb0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2cfc0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfe0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2cff0 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
2d000 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20  pgnoNew;        
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
2d030 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f pNew */..  ass
2d040 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2d050 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2d060 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2d070 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2d080 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2d090 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2d0a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2d0b0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2d0c0 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  =1 );..  if( pPa
2d0d0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72  ge->nCell<=0 ) r
2d0e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2d0f0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
2d100 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
2d110 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20  page. This page 
2d120 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2d130 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
2d140 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61   .  ** pPage. Ma
2d150 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ke the parent pa
2d160 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20  ge writable, so 
2d170 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76  that the new div
2d180 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d  ider cell.  ** m
2d190 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ay be inserted. 
2d1a0 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70  If both these op
2d1b0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63  erations are suc
2d1c0 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64  cessful, proceed
2d1d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
2d1e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2d1f0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
2d200 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  oNew, 0, 0);..  
2d210 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d220 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f  K ){..    u8 *pO
2d230 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b  ut = &pSpace[4];
2d240 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
2d250 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
2d260 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20  .pCell;.    u16 
2d270 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
2d280 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2d290 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f  l);.    u8 *pSto
2d2a0 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  p;..    assert( 
2d2b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2d2c0 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44  iteable(pNew->pD
2d2d0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73  bPage) );.    as
2d2e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
2d2f0 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b  ta[0]==(PTF_INTK
2d300 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
2d310 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20  PTF_LEAF) );.   
2d320 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
2d330 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2d340 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
2d350 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
2d360 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
2d370 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a  ell, &szCell);..
2d380 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2d390 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2d3a0 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
2d3b0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
2d3c0 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
2d3d0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
2d3e0 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
2d3f0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
2d400 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
2d410 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
2d420 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2d430 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  f either of thes
2d440 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  e.    ** operati
2d450 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72  ons fails, the r
2d460 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65  eturn code is se
2d470 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65  t, but the conte
2d480 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
2d490 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72  e parent page ar
2d4a0 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61  e still manipula
2d4b0 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20  ted by thh code 
2d4c0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68  below..    ** Th
2d4d0 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69  at is Ok, at thi
2d4e0 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65  s point the pare
2d4f0 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61  nt page is guara
2d500 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  nteed to.    ** 
2d510 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2d520 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  ty. Returning an
2d530 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c   error code will
2d540 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20   cause a.    ** 
2d550 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e  rollback, undoin
2d560 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  g any changes ma
2d570 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  de to the parent
2d580 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2d590 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2d5a0 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  UM ){.      ptrm
2d5b0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
2d5c0 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
2d5d0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c  , pParent->pgno,
2d5e0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
2d5f0 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69   szCell>pNew->mi
2d600 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
2d610 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
2d620 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20  tr(pNew, pCell, 
2d630 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
2d640 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72    }.  .    /* Cr
2d650 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63  eate a divider c
2d660 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ell to insert in
2d670 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20  to pParent. The 
2d680 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20  divider cell.   
2d690 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   ** consists of 
2d6a0 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75  a 4-byte page nu
2d6b0 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e  mber (the page n
2d6c0 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20  umber of pPage) 
2d6d0 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72  and.    ** a var
2d6e0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
2d6f0 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75   value (which mu
2d700 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  st be the same v
2d710 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20  alue as the.    
2d720 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f  ** largest key o
2d730 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a  n pPage)..    **
2d740 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20  .    ** To find 
2d750 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2d760 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20  value on pPage, 
2d770 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72  first find the r
2d780 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a  ight-most .    *
2d790 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e  * cell on pPage.
2d7a0 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66   The first two f
2d7b0 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65  ields of this ce
2d7c0 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20  ll are the .    
2d7d0 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  ** record-length
2d7e0 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
2d7f0 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d  gth integer at m
2d800 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73  ost 32-bits in s
2d810 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ize).    ** and 
2d820 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61  the key value (a
2d830 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2d840 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61   integer, may ha
2d850 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20  ve any value).. 
2d860 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
2d870 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e  of the while(...
2d880 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b  ) loops below sk
2d890 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63  ips over the rec
2d8a0 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ord-length.    *
2d8b0 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63  * field. The sec
2d8c0 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  ond while(...) l
2d8d0 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b  oop copies the k
2d8e0 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  ey value from th
2d8f0 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  e.    ** cell on
2d900 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20   pPage into the 
2d910 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2d920 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20     */.    pCell 
2d930 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2d940 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
2d950 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2d960 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2d970 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29  ile( (*(pCell++)
2d980 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
2d990 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74  pStop );.    pSt
2d9a0 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
2d9b0 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70      while( ((*(p
2d9c0 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c  Out++) = *(pCell
2d9d0 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43  ++))&0x80) && pC
2d9e0 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20  ell<pStop );..  
2d9f0 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
2da00 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
2da10 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a   into pParent. *
2da20 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c  /.    insertCell
2da30 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e  (pParent, pParen
2da40 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65  t->nCell, pSpace
2da50 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70  , (int)(pOut-pSp
2da60 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ace),.          
2da70 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70       0, pPage->p
2da80 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  gno, &rc);..    
2da90 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
2daa0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
2dab0 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
2dac0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
2dad0 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
2dae0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2daf0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2db00 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
2db10 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
2db20 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
2db30 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
2db40 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
2db50 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
2db60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2db70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2db80 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2db90 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
2dba0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2dbb0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
2dbc0 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
2dbd0 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
2dbe0 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
2dbf0 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
2dc00 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
2dc10 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
2dc20 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
2dc30 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
2dc40 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
2dc50 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
2dc60 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2dc70 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
2dc80 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
2dc90 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
2dca0 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
2dcb0 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
2dcc0 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
2dcd0 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
2dce0 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
2dcf0 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
2dd00 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2dd10 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
2dd20 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2dd30 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
2dd40 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
2dd50 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
2dd60 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
2dd70 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
2dd80 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
2dd90 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
2dda0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
2ddb0 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26  lPtr(pPage, z, &
2ddc0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
2ddd0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
2dde0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2ddf0 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
2de00 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  &z[info.iOverflo
2de10 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  w]);.        ptr
2de20 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c  mapGet(pBt, ovfl
2de30 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2de40 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2de50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2de60 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
2de70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2de80 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2de90 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  af ){.        Pg
2dea0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2deb0 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  yte(z);.        
2dec0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
2ded0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
2dee0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2def0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2df00 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2df10 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2df20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
2df30 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2df40 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2df50 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2df60 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2df70 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20  fset+8]);.      
2df80 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
2df90 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
2dfa0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2dfb0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2dfc0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2dfd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2dfe0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2dff0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2e000 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2e010 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   copy the conten
2e020 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ts of the b-tree
2e030 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a   node stored .**
2e040 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74   on page pFrom t
2e050 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  o page pTo. If p
2e060 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f  age pFrom was no
2e070 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  t a leaf page, t
2e080 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  hen.** the point
2e090 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
2e0a0 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61  or each child pa
2e0b0 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73  ge are updated s
2e0c0 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  o that the.** pa
2e0d0 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64  rent page stored
2e0e0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
2e0f0 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e  map is page pTo.
2e100 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69   If pFrom contai
2e110 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73  ned.** any cells
2e120 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70   with overflow p
2e130 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68  age pointers, th
2e140 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
2e150 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ding pointer.** 
2e160 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20  map entries are 
2e170 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20  also updated so 
2e180 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20  that the parent 
2e190 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f  page is page pTo
2e1a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
2e1b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61   is currently ca
2e1c0 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66  rrying any overf
2e1d0 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69  low cells (entri
2e1e0 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d  es in the.** Mem
2e1f0 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72  Page.aOvfl[] arr
2e200 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f  ay), they are no
2e210 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e  t copied to pTo.
2e220 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72   .**.** Before r
2e230 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70  eturning, page p
2e240 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69  To is reinitiali
2e250 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49  zed using btreeI
2e260 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
2e270 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
2e280 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2e290 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
2e2a0 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
2e2b0 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
2e2c0 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2e2d0 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
2e2e0 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
2e2f0 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
2e300 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
2e310 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
2e320 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
2e330 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
2e340 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  id copyNodeConte
2e350 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f  nt(MemPage *pFro
2e360 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c  m, MemPage *pTo,
2e370 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
2e380 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
2e390 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61  _OK ){.    BtSha
2e3a0 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20  red * const pBt 
2e3b0 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
2e3c0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72    u8 * const aFr
2e3d0 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74  om = pFrom->aDat
2e3e0 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  a;.    u8 * cons
2e3f0 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61  t aTo = pTo->aDa
2e400 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  ta;.    int cons
2e410 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72  t iFromHdr = pFr
2e420 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  om->hdrOffset;. 
2e430 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f     int const iTo
2e440 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
2e450 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
2e460 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
2e470 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a    int iData;.  .
2e480 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
2e490 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  From->isInit );.
2e4a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2e4b0 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72  m->nFree>=iToHdr
2e4c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e4d0 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
2e4e0 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42  iFromHdr+5])<=pB
2e4f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2e500 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
2e510 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
2e520 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
2e530 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
2e540 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74  pTo. */.    iDat
2e550 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
2e560 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
2e570 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
2e580 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
2e590 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
2e5a0 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
2e5b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  .    memcpy(&aTo
2e5c0 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
2e5d0 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
2e5e0 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
2e5f0 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
2e600 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69  .  .    /* Reini
2e610 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
2e620 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
2e630 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
2e640 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
2e650 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20     ** match the 
2e660 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e  new data. The in
2e670 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
2e680 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79  pTo can actually
2e690 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20   fail under.    
2e6a0 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72  ** fairly obscur
2e6b0 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c  e circumstances,
2e6c0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
2e6d0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69  is a copy of ini
2e6e0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
2e6f0 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20   page pFrom..   
2e700 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49   */.    pTo->isI
2e710 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  nit = 0;.    rc 
2e720 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
2e730 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pTo);.    if( rc
2e740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e750 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
2e760 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2e770 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
2e780 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2e790 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2e7a0 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2e7b0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2e7c0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
2e7d0 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
2e7e0 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
2e7f0 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
2e800 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
2e810 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2e820 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2e830 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
2e840 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
2e850 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2e860 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e870 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
2e880 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
2e890 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
2e8a0 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
2e8b0 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
2e8c0 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
2e8d0 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
2e8e0 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
2e8f0 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
2e900 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
2e910 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
2e920 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
2e930 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
2e940 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
2e950 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
2e960 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
2e970 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
2e980 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
2e990 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
2e9a0 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
2e9b0 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
2e9c0 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
2e9d0 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
2e9e0 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
2e9f0 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
2ea00 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
2ea10 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
2ea20 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
2ea30 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
2ea40 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
2ea50 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
2ea60 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
2ea70 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
2ea80 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
2ea90 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
2eaa0 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
2eab0 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
2eac0 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
2ead0 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
2eae0 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
2eaf0 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
2eb00 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
2eb10 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
2eb20 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
2eb30 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
2eb40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2eb50 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
2eb60 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
2eb70 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
2eb80 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
2eb90 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
2eba0 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
2ebb0 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
2ebc0 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
2ebd0 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
2ebe0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
2ebf0 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
2ec00 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
2ec10 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2ec20 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
2ec30 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
2ec40 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2ec50 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
2ec60 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
2ec70 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2ec80 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
2ec90 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
2eca0 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
2ecb0 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
2ecc0 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
2ecd0 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
2ece0 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
2ecf0 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
2ed00 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
2ed10 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
2ed20 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
2ed30 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
2ed40 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
2ed50 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
2ed60 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
2ed70 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
2ed80 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
2ed90 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
2eda0 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
2edb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
2edc0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
2edd0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
2ede0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
2edf0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
2ee00 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
2ee10 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
2ee20 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
2ee30 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
2ee40 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
2ee50 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
2ee60 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
2ee70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2ee80 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
2ee90 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
2eea0 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
2eeb0 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
2eec0 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
2eed0 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
2eee0 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
2eef0 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
2ef00 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
2ef10 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
2ef20 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
2ef30 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
2ef40 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
2ef50 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
2ef60 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2ef70 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
2ef80 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
2ef90 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2efa0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
2efb0 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
2efc0 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
2efd0 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
2efe0 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
2eff0 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
2f000 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
2f010 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
2f020 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
2f030 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
2f040 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
2f050 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
2f060 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
2f070 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
2f080 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
2f090 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
2f0a0 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2f0b0 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
2f0c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2f0d0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2f0e0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65  ce_nonroot(.  Me
2f0f0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f110 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20   Parent page of 
2f120 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62  siblings being b
2f130 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
2f140 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20   iParentIdx,    
2f150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f160 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61  Index of "the pa
2f170 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  ge" in pParent *
2f180 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61  /.  u8 *aOvflSpa
2f190 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
2f1a0 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65      /* page-size
2f1b0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2f1c0 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20  for parent ovfl 
2f1d0 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20  */.  int isRoot 
2f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f200 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f  pParent is a roo
2f210 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42  t-page */.){.  B
2f220 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2f230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f240 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
2f250 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
2f260 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f270 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f280 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2f290 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
2f2a0 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
2f2b0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
2f2c0 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
2f2d0 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
2f2e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
2f2f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f300 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f310 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
2f320 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
2f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f340 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f350 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
2f360 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
2f370 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2f380 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2f390 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
2f3a0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
2f3b0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
2f3c0 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
2f3d0 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
2f3e0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2f3f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2f400 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2f410 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
2f420 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
2f430 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
2f440 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2f450 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
2f460 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
2f470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f480 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
2f490 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
2f4a0 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
2f4b0 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
2f4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2f4d0 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
2f4e0 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
2f4f0 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
2f500 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2f510 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
2f520 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
2f530 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
2f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f550 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
2f560 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
2f570 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
2f580 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
2f590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2f5a0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
2f5b0 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
2f5c0 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
2f5d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
2f5e0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2f5f0 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
2f600 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
2f610 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
2f620 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2f630 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2f640 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
2f650 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
2f660 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
2f670 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
2f680 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
2f690 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
2f6a0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
2f6b0 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
2f6c0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
2f6d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2f6e0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
2f6f0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
2f700 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
2f710 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
2f720 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
2f730 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2f740 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
2f750 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
2f760 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
2f770 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
2f780 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
2f790 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
2f7a0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2f7b0 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
2f7c0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2f7d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
2f7e0 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
2f7f0 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
2f800 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
2f810 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
2f820 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
2f830 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
2f840 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
2f850 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
2f860 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f870 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
2f880 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
2f890 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f8b0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
2f8c0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2f8d0 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
2f8e0 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
2f8f0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2f900 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
2f910 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
2f920 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f940 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
2f950 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
2f960 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
2f970 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
2f980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f990 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2f9a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2f9b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2f9c0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2f9d0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2f9e0 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
2f9f0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
2fa00 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
2fa10 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
2fa20 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
2fa30 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
2fa40 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2fa50 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
2fa60 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
2fa70 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
2fa80 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
2fa90 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
2faa0 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
2fab0 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
2fac0 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
2fad0 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
2fae0 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
2faf0 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
2fb00 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
2fb10 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
2fb20 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
2fb30 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20  BtreeDelete().. 
2fb40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2fb50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2fb60 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2fb70 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2fb80 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2fb90 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2fba0 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  || pParent->aOvf
2fbb0 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e  l[0].idx==iParen
2fbc0 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
2fbd0 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
2fbe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fbf0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2fc00 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
2fc10 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
2fc20 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
2fc30 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
2fc40 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
2fc50 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
2fc60 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
2fc70 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
2fc80 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
2fc90 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
2fca0 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
2fcb0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
2fcc0 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
2fcd0 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
2fce0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
2fcf0 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
2fd00 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
2fd10 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
2fd20 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2fd30 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2fd40 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2fd50 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2fd60 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
2fd70 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
2fd80 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
2fd90 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
2fda0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2fdb0 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
2fdc0 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
2fdd0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
2fde0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
2fdf0 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
2fe00 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
2fe10 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
2fe20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61  page, since if a
2fe30 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20  ny existed they 
2fe40 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61  will.  ** have a
2fe50 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f  lready been remo
2fe60 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20  ved..  */.  i = 
2fe70 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2fe80 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ow + pParent->nC
2fe90 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29  ell;.  if( i<2 )
2fea0 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
2feb0 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b  .    nOld = i+1;
2fec0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
2fed0 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20  ld = 3;.    if( 
2fee0 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
2fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff00 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
2ff10 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2ff20 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
2ff30 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
2ff40 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  i-2;.    }else{.
2ff50 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
2ff60 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
2ff70 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d  }.    i = 2;.  }
2ff80 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d  .  if( (i+nxDiv-
2ff90 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2ffa0 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ow)==pParent->nC
2ffb0 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ell ){.    pRigh
2ffc0 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44  t = &pParent->aD
2ffd0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2ffe0 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c  Offset+8];.  }el
2fff0 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d  se{.    pRight =
30000 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
30010 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
30020 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
30030 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74    }.  pgno = get
30040 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20  4byte(pRight);. 
30050 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
30060 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
30070 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
30080 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  &apOld[i]);.    
30090 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
300a0 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
300b0 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
300c0 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
300d0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
300e0 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
300f0 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
30100 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
30110 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
30120 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
30130 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
30140 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
30150 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
30160 5d 2e 69 64 78 20 26 26 20 70 50 61 72 65 6e 74  ].idx && pParent
30170 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
30180 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
30190 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
301a0 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70  ].pCell;.      p
301b0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
301c0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
301d0 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
301e0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
301f0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
30200 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
30210 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  low = 0;.    }el
30220 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  se{.      apDiv[
30230 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
30240 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
30250 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
30260 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  w);.      pgno =
30270 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
30280 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
30290 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
302a0 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
302b0 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [i]);..      /* 
302c0 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72  Drop the cell fr
302d0 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
302e0 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69  ge. apDiv[i] sti
302f0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20  ll points to.   
30300 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77     ** the cell w
30310 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ithin the parent
30320 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
30330 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65   has been droppe
30340 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  d..      ** This
30350 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
30360 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c   dropping a cell
30370 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
30380 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
30390 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
303a0 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66  f it, and this f
303b0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
303c0 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a   need the first.
303d0 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
303e0 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  tes of the divid
303f0 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20  er cell. So the 
30400 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20  pointer is safe 
30410 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
30420 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20  later on.  .    
30430 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
30440 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63  less SQLite is c
30450 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72  ompiled in secur
30460 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
30470 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20  n this case,.   
30480 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
30490 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
304a0 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
304b0 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
304c0 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
304d0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
304e0 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
304f0 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
30500 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
30510 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
30520 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
30530 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
30540 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
30550 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
30560 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
30570 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
30580 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65   pBt->secureDele
30590 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
305a0 74 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f  t iOff = SQLITE_
305b0 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76  PTR_TO_INT(apDiv
305c0 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54  [i]) - SQLITE_PT
305d0 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74  R_TO_INT(pParent
305e0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
305f0 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65    if( (iOff+szNe
30600 77 5b 69 5d 29 3e 70 42 74 2d 3e 75 73 61 62 6c  w[i])>pBt->usabl
30610 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
30620 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
30630 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
30640 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70         memset(ap
30650 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69  Old, 0, (i+1)*si
30660 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
30670 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
30680 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
30690 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
306a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
306b0 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66  (&aOvflSpace[iOf
306c0 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  f], apDiv[i], sz
306d0 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  New[i]);.       
306e0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61     apDiv[i] = &a
306f0 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b  OvflSpace[apDiv[
30700 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  i]-pParent->aDat
30710 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a];.        }.  
30720 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70      }.      drop
30730 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
30740 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
30750 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b  Overflow, szNew[
30760 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  i], &rc);.    }.
30770 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
30780 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
30790 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65  ple of 4 in orde
307a0 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
307b0 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
307c0 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
307d0 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
307e0 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20  + 3)&~3;..  /*. 
307f0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
30800 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
30810 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
30820 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  k = pBt->pageSiz
30830 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e + ROUND8(sizeo
30840 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73  f(MemPage));.  s
30850 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20  zScratch =.     
30860 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
30870 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
30880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30890 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
308a0 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
308b0 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20  of(u16)         
308c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
308d0 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   szCell */.     
308e0 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  + pBt->pageSize 
308f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30910 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20   aSpace1 */.    
30920 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20   + k*nOld;      
30930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30950 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61  * Page copies (a
30960 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65  pCopy) */.  apCe
30970 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ll = sqlite3Scra
30980 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72  tchMalloc( szScr
30990 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61  atch ); .  if( a
309a0 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
309b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
309c0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
309d0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
309e0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
309f0 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
30a00 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20  lls];.  aSpace1 
30a10 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
30a20 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
30a30 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
30a40 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65  ALIGNMENT(aSpace
30a50 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  1) );..  /*.  **
30a60 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74   Load pointers t
30a70 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73  o all cells on s
30a80 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64  ibling pages and
30a90 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
30aa0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  ls.  ** into the
30ab0 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20   local apCell[] 
30ac0 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70  array.  Make cop
30ad0 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  ies of the divid
30ae0 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
30af0 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
30b00 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d  d from aSpace1[]
30b10 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
30b20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
30b30 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
30b40 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
30b50 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
30b60 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
30b70 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
30b80 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
30b90 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
30ba0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
30bb0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
30bc0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
30bd0 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
30be0 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
30bf0 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
30c00 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
30c10 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
30c20 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
30c30 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
30c40 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
30c50 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
30c60 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
30c70 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
30c80 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
30c90 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
30ca0 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
30cb0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
30cc0 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
30cd0 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
30ce0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
30cf0 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
30d00 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
30d10 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
30d20 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
30d30 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
30d40 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
30d50 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
30d60 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
30d70 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
30d80 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
30d90 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
30da0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
30db0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
30dc0 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
30dd0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
30de0 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
30df0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
30e00 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
30e10 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
30e20 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
30e30 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
30e40 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
30e50 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
30e60 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
30e70 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
30e80 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
30e90 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
30ea0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
30eb0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
30ec0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
30ed0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
30ee0 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
30ef0 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
30f00 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
30f10 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
30f20 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
30f30 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
30f40 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
30f50 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
30f60 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
30f70 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
30f80 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
30f90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
30fa0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
30fb0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
30fc0 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
30fd0 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
30fe0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30ff0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
31000 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
31010 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
31020 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
31030 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
31040 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
31050 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
31060 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
31070 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
31080 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
31090 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
310a0 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
310b0 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
310c0 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
310d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
310e0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
310f0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
31100 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
31110 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
31120 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
31130 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
31140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
31150 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
31160 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  /4 );.      asse
31170 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74  rt( iSpace1<=pBt
31180 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
31190 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
311a0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
311b0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
311c0 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
311d0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
311e0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
311f0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
31200 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
31210 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
31220 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
31230 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
31240 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
31250 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
31260 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
31270 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
31280 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
31290 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
312a0 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
312b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
312c0 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
312d0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
312e0 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
312f0 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
31300 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
31310 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
31320 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
31330 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
31340 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
31350 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
31370 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
31380 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
31390 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
313a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
313b0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
313c0 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
313d0 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
313e0 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
313f0 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
31400 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31410 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
31420 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
31430 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
31440 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
31450 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
31460 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
31470 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
31480 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
31490 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
314a0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
314b0 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
314c0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
314d0 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
314e0 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
314f0 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
31500 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
31510 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
31520 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
31530 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
31540 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
31550 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
31560 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
31570 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
31580 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
31590 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
315a0 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
315b0 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
315c0 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
315d0 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
315e0 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
315f0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
31600 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
31610 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
31620 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
31630 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
31640 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
31650 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
31660 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
31670 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
31680 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
31690 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
316a0 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
316b0 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
316c0 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
316d0 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
316e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
316f0 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
31700 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
31710 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
31720 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
31730 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
31740 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
31750 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
31760 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
31770 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
31780 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
31790 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
317a0 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
317b0 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
317c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
317d0 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
317e0 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
317f0 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
31800 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
31810 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
31820 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
31830 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31840 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
31850 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
31860 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
31870 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
31880 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
31890 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
318a0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
318b0 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
318c0 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
318d0 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
318e0 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
318f0 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
31900 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
31910 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
31920 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
31930 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
31940 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
31950 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
31960 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
31970 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
31980 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
31990 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
319a0 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
319b0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
319c0 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
319d0 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
319e0 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
319f0 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
31a00 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
31a10 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
31a20 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
31a30 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
31a40 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
31a50 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
31a60 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
31a70 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
31a80 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
31a90 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
31aa0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
31ab0 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
31ac0 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
31ad0 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
31ae0 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
31af0 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
31b00 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
31b10 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
31b20 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
31b30 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
31b40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
31b50 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
31b60 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
31b70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
31b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31b90 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
31ba0 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
31bb0 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
31bc0 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
31bd0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
31be0 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
31bf0 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
31c00 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
31c10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
31c20 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
31c30 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
31c40 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
31c50 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
31c60 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
31c70 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
31c80 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
31c90 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
31ca0 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
31cb0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
31cc0 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
31cd0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
31ce0 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
31cf0 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
31d00 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
31d10 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
31d20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
31d30 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
31d40 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
31d50 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
31d60 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
31d70 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a  or pPage is.  **
31d80 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
31d90 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
31da0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
31db0 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
31dc0 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
31dd0 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
31de0 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
31df0 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
31e00 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  /.  assert( cntN
31e10 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
31e20 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
31e30 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
31e40 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  0) );..  TRACE((
31e50 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
31e60 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20  d %d %d  ",.    
31e70 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apOld[0]->pgno, 
31e80 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61  .    nOld>=2 ? a
31e90 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[1]->pgno : 
31ea0 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
31eb0 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20   apOld[2]->pgno 
31ec0 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a  : 0.  ));..  /*.
31ed0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
31ee0 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
31ef0 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
31f00 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
31f10 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d  .  if( apOld[0]-
31f20 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20  >pgno<=1 ){.    
31f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31f40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
31f50 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
31f60 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c  up;.  }.  pageFl
31f70 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ags = apOld[0]->
31f80 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
31f90 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
31fa0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
31fb0 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
31fc0 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
31fd0 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
31fe0 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
31ff0 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
32000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32010 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
32020 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
32030 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
32040 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
32050 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
32060 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
32070 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
32080 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
32090 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
320a0 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c  ew, &pgno, pgno,
320b0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
320c0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
320d0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
320e0 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
320f0 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
32100 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
32110 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32120 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
32130 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
32140 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
32150 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
32160 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
32170 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
32180 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
32190 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
321a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
321b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
321c0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
321d0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
321e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
321f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
32200 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
32210 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
32220 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
32230 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
32240 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
32250 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
32260 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  i], &rc);.    if
32270 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
32280 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
32290 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
322a0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
322b0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
322c0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
322d0 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
322e0 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
322f0 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
32300 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
32310 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
32320 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
32330 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
32340 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
32350 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
32360 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
32370 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
32380 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
32390 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
323a0 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
323b0 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
323c0 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
323d0 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
323e0 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
323f0 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
32400 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
32410 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
32420 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
32430 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
32440 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
32450 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
32460 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
32470 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
32480 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
32490 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
324a0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
324b0 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
324c0 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
324d0 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
324e0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
324f0 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
32500 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
32510 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
32520 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
32530 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
32540 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
32550 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
32560 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
32570 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
32580 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
32590 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
325a0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
325b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
325c0 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
325d0 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
325e0 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
325f0 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
32600 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
32610 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e  ew[i];.      apN
32620 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
32630 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
32640 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
32650 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
32660 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28  "new: %d(%d) %d(
32670 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
32680 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
32690 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c   apNew[0]->pgno,
326a0 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
326b0 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31  New>=2 ? apNew[1
326c0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
326d0 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
326e0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
326f0 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e   ? apNew[2]->pgn
32700 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  o : 0, nNew>=3 ?
32710 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
32720 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e     nNew>=4 ? apN
32730 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[3]->pgno : 0,
32740 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
32750 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
32760 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d  w>=5 ? apNew[4]-
32770 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
32780 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
32790 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0));..  assert( 
327a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
327b0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
327c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70  >pDbPage) );.  p
327d0 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20  ut4byte(pRight, 
327e0 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70  apNew[nNew-1]->p
327f0 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  gno);..  /*.  **
32800 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
32810 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
32820 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
32830 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
32840 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
32850 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
32860 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
32870 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
32880 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
32890 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
328a0 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
328b0 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
328c0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
328d0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
328e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
328f0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
32900 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
32910 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
32920 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
32930 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
32940 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
32950 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
32960 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
32970 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
32980 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
32990 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
329a0 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
329b0 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74   );..    j = cnt
329c0 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
329d0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
329e0 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
329f0 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
32a00 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
32a10 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
32a20 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
32a30 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
32a40 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
32a50 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77    assert( i<nNew
32a60 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29  -1 || j==nCell )
32a70 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c  ;.    if( j<nCel
32a80 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
32a90 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
32aa0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
32ab0 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
32ac0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
32ad0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
32ae0 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
32af0 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
32b00 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
32b10 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  n;.      pTemp =
32b20 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76   &aOvflSpace[iOv
32b30 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  flSpace];.      
32b40 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
32b50 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
32b60 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
32b70 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
32b80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
32b90 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
32ba0 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
32bb0 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
32bc0 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
32bd0 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
32be0 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
32bf0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
32c00 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
32c10 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
32c20 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
32c30 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
32c40 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
32c50 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
32c60 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
32c70 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
32c80 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
32c90 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
32ca0 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
32cb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
32cc0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
32cd0 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
32ce0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
32cf0 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
32d00 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
32d10 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
32d20 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  p;.        sz = 
32d30 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70  4 + putVarint(&p
32d40 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b  Cell[4], info.nK
32d50 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ey);.        pTe
32d60 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
32d70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
32d80 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
32d90 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
32da0 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
32db0 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
32dc0 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
32dd0 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
32de0 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
32df0 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
32e00 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
32e10 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
32e20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
32e30 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
32e40 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
32e50 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
32e60 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61   ** (see btreePa
32e70 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
32e80 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
32e90 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
32ea0 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
32eb0 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
32ec0 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
32ed0 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
32ee0 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
32ef0 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
32f00 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
32f10 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
32f20 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
32f30 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
32f40 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
32f50 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
32f60 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
32f70 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
32f80 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
32f90 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
32fa0 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
32fb0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
32fc0 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
32fd0 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
32fe0 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
32ff0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33000 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
33010 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
33020 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
33030 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
33040 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
33050 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
33060 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
33070 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
33080 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a  iOvflSpace += sz
33090 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
330a0 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
330b0 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
330c0 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c  ert( iOvflSpace<
330d0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
330e0 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
330f0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
33100 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
33110 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
33120 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
33130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33140 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
33150 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
33160 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
33170 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33180 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
33190 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
331a0 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
331b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
331c0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
331d0 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
331e0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
331f0 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
33200 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
33210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
33220 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
33230 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
33240 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
33250 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
33260 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
33270 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
33280 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
33290 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
332a0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
332b0 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
332c0 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
332d0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
332e0 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
332f0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
33300 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
33310 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
33320 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
33330 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
33340 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
33350 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
33360 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
33370 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
33380 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
33390 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
333a0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
333b0 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
333c0 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
333d0 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
333e0 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
333f0 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
33400 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
33410 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
33420 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
33430 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
33440 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
33450 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
33460 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
33470 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
33480 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
33490 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
334a0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
334b0 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
334c0 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
334d0 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
334e0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
334f0 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
33500 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
33510 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
33520 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
33530 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
33540 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
33550 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
33560 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
33570 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
33580 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
33590 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
335a0 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
335b0 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
335c0 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
335d0 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
335e0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
335f0 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
33600 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
33610 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
33620 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
33630 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
33640 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
33650 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
33660 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
33670 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
33680 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70   .    );.    cop
33690 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
336a0 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20  ew[0], pParent, 
336b0 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61  &rc);.    freePa
336c0 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63  ge(apNew[0], &rc
336d0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  );.  }else if( I
336e0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
336f0 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
33700 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
33710 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
33720 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
33730 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
33740 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
33750 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
33760 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
33770 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
33780 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
33790 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
337a0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
337b0 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
337c0 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
337d0 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
337e0 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
337f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
33800 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
33810 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
33820 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
33830 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
33840 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
33850 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
33860 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
33870 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
33880 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
33890 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
338a0 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
338b0 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
338c0 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
338d0 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
338e0 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
338f0 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
33900 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
33910 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
33920 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
33930 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
33940 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
33950 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
33960 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
33970 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
33980 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
33990 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
339a0 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
339b0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
339c0 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
339d0 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
339e0 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
339f0 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
33a00 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
33a10 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
33a20 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
33a30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
33a40 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
33a50 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
33a60 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
33a70 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
33a80 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
33a90 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
33aa0 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
33ab0 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
33ac0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
33ad0 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
33ae0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
33af0 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
33b00 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
33b10 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
33b20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
33b30 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
33b40 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
33b50 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
33b60 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
33b70 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
33b80 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
33b90 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
33ba0 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
33bb0 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
33bc0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
33bd0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
33be0 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
33bf0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
33c00 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
33c10 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
33c20 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
33c30 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
33c40 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
33c50 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
33c60 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
33c70 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
33c80 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
33c90 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
33ca0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
33cb0 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
33cc0 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
33cd0 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
33ce0 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
33cf0 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
33d00 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
33d10 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
33d20 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
33d30 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
33d40 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
33d50 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
33d60 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
33d70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
33d80 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
33d90 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
33da0 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
33db0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
33dc0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
33dd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
33de0 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
33df0 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
33e00 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
33e10 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
33e20 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
33e30 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
33e40 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
33e50 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
33e60 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
33e70 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
33e80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ea0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
33eb0 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
33ec0 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
33ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
33ef0 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
33f00 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
33f10 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
33f20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
33f30 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
33f40 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
33f50 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
33f60 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
33f70 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
33f80 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
33f90 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
33fa0 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
33fb0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
33fc0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
33fd0 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
33fe0 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
33ff0 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
34000 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
34010 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
34020 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f  l. */.        pO
34030 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d  ld = apCopy[++j]
34040 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f  ;.        iNextO
34050 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ld = i + !leafDa
34060 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ta + pOld->nCell
34070 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   + pOld->nOverfl
34080 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
34090 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  pOld->nOverflow 
340a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
340b0 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
340c0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
340d0 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20      iOverflow = 
340e0 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
340f0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
34100 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dx;.        }.  
34110 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
34120 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20  = !leafData;  . 
34130 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
34140 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30  sert(nOverflow>0
34150 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20   || iOverflow<i 
34160 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
34170 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70  nOverflow<2 || p
34180 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
34190 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  x==pOld->aOvfl[1
341a0 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
341b0 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
341c0 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <3 || pOld->aOvf
341d0 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[1].idx==pOld->
341e0 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b  aOvfl[2].idx-1);
341f0 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f  .      if( i==iO
34200 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
34210 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31     isDivider = 1
34220 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d  ;.        if( (-
34230 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b  -nOverflow)>0 ){
34240 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
34250 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  flow++;.        
34260 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
34270 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b   if( i==cntNew[k
34280 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
34290 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
342a0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
342b0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
342c0 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20  t cell on new.  
342d0 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
342e0 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20   page k. If the 
342f0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
34300 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
34310 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
34320 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
34330 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76   cell i is a div
34340 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20  ider cell.  */. 
34350 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70         pNew = ap
34360 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20  New[++k];.      
34370 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20    if( !leafData 
34380 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34390 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
343a0 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20  ( j<nOld );.    
343b0 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77    assert( k<nNew
343c0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
343d0 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72   the cell was or
343e0 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72  iginally divider
343f0 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f   cell (and is no
34400 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20  t now) or.      
34410 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ** an overflow c
34420 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ell, or if the c
34430 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ell was located 
34440 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  on a different s
34450 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ibling.      ** 
34460 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20  page before the 
34470 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20  balancing, then 
34480 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
34490 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
344a0 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  ed.      ** with
344b0 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76   any child or ov
344c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65  erflow pages nee
344d0 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
344e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
344f0 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64  sDivider || pOld
34500 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
34510 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
34520 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
34530 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
34540 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
34550 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d  t4byte(apCell[i]
34560 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
34570 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
34580 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34590 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
345a0 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  i]>pNew->minLoca
345b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
345c0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
345d0 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  pNew, apCell[i],
345e0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   &rc);.        }
345f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
34600 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
34610 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
34620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
34630 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
34640 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79  u32 key = get4by
34650 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44  te(&apNew[i]->aD
34660 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
34670 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
34680 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  key, PTRMAP_BTRE
34690 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e  E, apNew[i]->pgn
346a0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  o, &rc);.      }
346b0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
346c0 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43    /* The ptrmapC
346d0 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74  heckPages() cont
346e0 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74  ains assert() st
346f0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65  atements that ve
34700 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a  rify that.    **
34710 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70   all pointer map
34720 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63   pages are set c
34730 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69  orrectly. This i
34740 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20  s helpful while 
34750 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e  .    ** debuggin
34760 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  g. This is usual
34770 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61  ly disabled beca
34780 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61  use a corrupt da
34790 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a  tabase may.    *
347a0 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72  * cause an asser
347b0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  t() statement to
347c0 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70   fail.  */.    p
347d0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
347e0 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20  apNew, nNew);.  
347f0 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
34800 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b  es(&pParent, 1);
34810 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61  .#endif.  }..  a
34820 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
34830 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43  isInit );.  TRAC
34840 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
34850 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  ished: old=%d ne
34860 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
34870 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64  ,.          nOld
34880 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
34890 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61  ..  /*.  ** Clea
348a0 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
348b0 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
348c0 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
348d0 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
348e0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
348f0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
34900 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
34910 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
34920 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
34930 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
34940 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
34950 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  [i]);.  }..  ret
34960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
34970 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
34980 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
34990 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
349a0 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
349b0 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c  re is.** overful
349c0 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  l (has one or mo
349d0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
349e0 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  s)..**.** A new 
349f0 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c  child page is al
34a00 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
34a10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
34a20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20  current root.** 
34a30 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  page, including 
34a40 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20  overflow cells, 
34a50 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  are copied into 
34a60 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72  the child. The r
34a70 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74  oot.** page is t
34a80 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20  hen overwritten 
34a90 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d  to make it an em
34aa0 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68  pty page with th
34ab0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a  e right-child .*
34ac0 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  * pointer pointi
34ad0 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ng to the new pa
34ae0 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ge..**.** Before
34af0 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20   returning, all 
34b00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
34b10 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
34b20 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74  g to pages .** t
34b30 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c  hat the new chil
34b40 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61  d-page now conta
34b50 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
34b60 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65  are updated. The
34b70 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73  .** entry corres
34b80 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e  ponding to the n
34b90 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  ew right-child p
34ba0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f  ointer of the ro
34bb0 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c  ot.** page is al
34bc0 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  so updated..**.*
34bd0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
34be0 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
34bf0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65   to contain a re
34c00 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
34c10 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e  hild .** page an
34c20 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
34c30 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
34c40 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72   case the caller
34c50 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
34c60 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
34c70 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c  age() on *ppChil
34c80 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20  d exactly once. 
34c90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
34ca0 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  rs,.** an error 
34cb0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
34cc0 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73   and *ppChild is
34cd0 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74   set to 0..*/.st
34ce0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
34cf0 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
34d00 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20  *pRoot, MemPage 
34d10 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e  **ppChild){.  in
34d20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
34d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34d40 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
34d50 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
34d60 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
34d70 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
34d80 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
34d90 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
34da0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
34db0 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20  oChild = 0;     
34dc0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
34dd0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
34de0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
34df0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
34e00 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20   pRoot->pBt;    
34e10 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
34e20 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
34e30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
34e40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34e50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
34e60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
34e70 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74  /* Make pRoot, t
34e80 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
34e90 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74  the b-tree, writ
34ea0 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61  able. Allocate a
34eb0 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20   new .  ** page 
34ec0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
34ed0 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
34ee0 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43  hild of pPage. C
34ef0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
34f00 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64  .  ** of the nod
34f10 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f  e stored on pRoo
34f20 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63  t into the new c
34f30 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  hild page..  */.
34f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34f50 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
34f60 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
34f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34f80 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
34f90 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
34fa0 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69  &pChild,&pgnoChi
34fb0 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30  ld,pRoot->pgno,0
34fc0 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43  );.    copyNodeC
34fd0 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43  ontent(pRoot, pC
34fe0 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20  hild, &rc);.    
34ff0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
35000 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
35010 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69  Put(pBt, pgnoChi
35020 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ld, PTRMAP_BTREE
35030 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26  , pRoot->pgno, &
35040 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
35050 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
35060 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20  ppChild = 0;.   
35070 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
35080 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
35090 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
350a0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
350b0 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
350c0 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
350d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
350e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
350f0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
35100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
35110 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f  hild->nCell==pRo
35120 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ot->nCell );..  
35130 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
35140 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
35150 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d  to %d\n", pRoot-
35160 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
35170 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70  gno));..  /* Cop
35180 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  y the overflow c
35190 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20  ells from pRoot 
351a0 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d  to pChild */.  m
351b0 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
351c0 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66  vfl, pRoot->aOvf
351d0 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  l, pRoot->nOverf
351e0 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74  low*sizeof(pRoot
351f0 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
35200 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
35210 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  w = pRoot->nOver
35220 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  flow;..  /* Zero
35230 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
35240 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73   pRoot. Then ins
35250 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74  tall pChild as t
35260 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20  he right-child. 
35270 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  */.  zeroPage(pR
35280 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  oot, pChild->aDa
35290 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
352a0 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
352b0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
352c0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
352d0 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20  , pgnoChild);.. 
352e0 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69   *ppChild = pChi
352f0 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ld;.  return SQL
35300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
35310 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70   The page that p
35320 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  Cur currently po
35330 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74  ints to has just
35340 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69   been modified i
35350 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54  n.** some way. T
35360 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67  his function fig
35370 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73  ures out if this
35380 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65   modification me
35390 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20  ans the.** tree 
353a0 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
353b0 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nced, and if so 
353c0 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70  calls the approp
353d0 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
353e0 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c  .** routine. Bal
353f0 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  ancing routines 
35400 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c  are:.**.**   bal
35410 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20  ance_quick().** 
35420 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72    balance_deeper
35430 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
35440 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61  nonroot().*/.sta
35450 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
35460 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
35470 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35480 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69  TE_OK;.  const i
35490 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e  nt nMin = pCur->
354a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
354b0 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42  * 2 / 3;.  u8 aB
354c0 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
354d0 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65  [13];.  u8 *pFre
354e0 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e  e = 0;..  TESTON
354f0 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
35500 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30  quick_called = 0
35510 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   );.  TESTONLY( 
35520 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
35530 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  er_called = 0 );
35540 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74  ..  do {.    int
35550 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
35560 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  Page;.    MemPag
35570 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
35580 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a  >apPage[iPage];.
35590 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d  .    if( iPage==
355a0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
355b0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
355c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
355d0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
355e0 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65  he b-tree is ove
355f0 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63  rfull. In this c
35600 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20  ase call the.   
35610 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f       ** balance_
35620 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f  deeper() functio
35630 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  n to create a ne
35640 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20  w child for the 
35650 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
35660 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68    ** and copy th
35670 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
35680 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ts of the root-p
35690 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20  age to it. The. 
356a0 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69         ** next i
356b0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
356c0 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
356d0 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70  ance the child p
356e0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20  age..        */ 
356f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35700 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
35710 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
35720 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
35730 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
35740 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ge, &pCur->apPag
35750 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e[1]);.        i
35760 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
35780 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20  ur->iPage = 1;. 
35790 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
357a0 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[0] = 0;.   
357b0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
357c0 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[1] = 0;.     
357d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
357e0 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f  r->apPage[1]->nO
357f0 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20  verflow );.     
35800 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
35810 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
35820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
35830 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  se if( pPage->nO
35840 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
35850 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e  age->nFree<=nMin
35860 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
35870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35880 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73    MemPage * cons
35890 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72  t pParent = pCur
358a0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31  ->apPage[iPage-1
358b0 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  ];.      int con
358c0 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e  st iIdx = pCur->
358d0 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a  aiIdx[iPage-1];.
358e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
358f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
35900 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
35910 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
35920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e  QLITE_OK ){.#ifn
35930 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35940 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20  QUICKBALANCE.   
35950 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
35960 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20  hasData.        
35970 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
35980 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20  flow==1.        
35990 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   && pPage->aOvfl
359a0 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
359b0 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26  nCell.         &
359c0 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  & pParent->pgno!
359d0 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
359e0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69  Parent->nCell==i
359f0 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  Idx.        ){. 
35a00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
35a10 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
35a20 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
35a30 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67   sibling of pPag
35a40 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20  e on which.     
35a50 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65       ** to store
35a60 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
35a70 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ll. balance_quic
35a80 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65  k() inserts a ne
35a90 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  w cell.         
35aa0 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74   ** into pParent
35ab0 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
35ac0 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c  e pParent overfl
35ad0 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20  ow. If this.    
35ae0 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
35af0 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72  , the next inter
35b00 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
35b10 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
35b20 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20  e pParent .     
35b30 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68       ** use eith
35b40 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  er balance_nonro
35b50 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f  ot() or balance_
35b60 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20  deeper(). Until 
35b70 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
35b80 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f  * happens, the o
35b90 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
35ba0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42  stored in the aB
35bb0 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
35bc0 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  [].          ** 
35bd0 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20  buffer. .       
35be0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
35bf0 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  ** The purpose o
35c00 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
35c10 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63  assert() is to c
35c20 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61  heck that only a
35c30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
35c40 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ngle call to bal
35c50 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
35c60 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61  made for each ca
35c70 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
35c80 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
35c90 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e  . If this were n
35ca0 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73  ot verified, a s
35cb0 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76  ubtle bug involv
35cc0 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20  ing reuse.      
35cd0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42      ** of the aB
35ce0 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
35cf0 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  [] might sneak i
35d00 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n..          */.
35d10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
35d20 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ( (balance_quick
35d30 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
35d40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35d50 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50  balance_quick(pP
35d60 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42  arent, pPage, aB
35d70 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
35d80 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
35d90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
35da0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
35db0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c  n this case, cal
35dc0 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  l balance_nonroo
35dd0 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62  t() to redistrib
35de0 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20  ute cells.      
35df0 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70      ** between p
35e00 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32  Page and up to 2
35e10 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20   of its sibling 
35e20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f  pages. This invo
35e30 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  lves.          *
35e40 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  * modifying the 
35e50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72  contents of pPar
35e60 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
35e70 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a  ause pParent to.
35e80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
35e90 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
35ea0 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e  underfull. The n
35eb0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
35ec0 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20   the do-loop.   
35ed0 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
35ee0 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
35ef0 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63  t page to correc
35f00 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20  t this..        
35f10 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20    ** .          
35f20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74  ** If the parent
35f30 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76   page becomes ov
35f40 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72  erfull, the over
35f50 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c  flow cell or cel
35f60 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
35f70 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
35f80 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
35f90 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
35fa0 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20  ately below. .  
35fb0 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62          ** A sub
35fc0 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
35fd0 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
35fe0 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20   will deal with 
35ff0 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
36000 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c    ** calling bal
36010 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28  ance_nonroot() (
36020 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
36030 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
36040 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  irst,.          
36050 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27  ** but it doesn'
36060 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72  t deal with over
36070 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73  flow cells - jus
36080 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20  t moves them to 
36090 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  a.          ** d
360a0 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20  ifferent page). 
360b0 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71  Once this subseq
360c0 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c  uent call to bal
360d0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a  ance_nonroot() .
360e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
360f0 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69   completed, it i
36100 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73  s safe to releas
36110 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
36120 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20  fer used by.    
36130 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65        ** the pre
36140 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74  vious call, as t
36150 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
36160 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20   data will have 
36170 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20  been .          
36180 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72  ** copied either
36190 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
361a0 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
361b0 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65  e or into the ne
361c0 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  w.          ** p
361d0 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73  Space buffer pas
361e0 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65  sed to the latte
361f0 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  r call to balanc
36200 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20  e_nonroot()..   
36210 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
36220 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
36230 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
36240 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61  oc(pCur->pBt->pa
36250 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
36260 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
36270 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c  nonroot(pParent,
36280 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69   iIdx, pSpace, i
36290 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20  Page==1);.      
362a0 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b      if( pFree ){
362b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
362c0 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20  If pFree is not 
362d0 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20  NULL, it points 
362e0 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
362f0 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20  ffer used .     
36300 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70         ** by a p
36310 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
36320 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
36330 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20  ). Its contents 
36340 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  are.            
36350 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69  ** now stored ei
36360 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74  ther on real dat
36370 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77  abase pages or w
36380 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20  ithin the .     
36390 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53         ** new pS
363a0 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20  pace buffer, so 
363b0 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79  it may be safely
363c0 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a   freed here. */.
363d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
363e0 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
363f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
36400 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
36410 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
36420 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66  will be freed af
36430 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c  ter the next cal
36440 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  l to.          *
36450 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  * balance_nonroo
36460 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66  t(), or just bef
36470 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
36480 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68  n returns, which
36490 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ever.          *
364a0 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a  * comes first. *
364b0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65  /.          pFre
364c0 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20  e = pSpace;.    
364d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
364e0 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
364f0 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20  rflow = 0;..    
36500 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74    /* The next it
36510 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
36520 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20  o-loop balances 
36530 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
36540 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
36550 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
36560 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
36570 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  -;.    }.  }whil
36580 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
36590 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65   );..  if( pFree
365a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
365b0 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
365c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
365d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  .}.../*.** Inser
365e0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
365f0 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
36600 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
36610 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
36620 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
36630 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
36640 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
36650 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
36660 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
36670 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
36680 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
36690 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
366a0 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
366b0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
366c0 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
366d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
366e0 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
366f0 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
36700 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
36710 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
36720 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
36730 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
36740 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
36750 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
36760 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  h ignored..**.**
36770 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75   If the seekResu
36780 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  lt parameter is 
36790 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
367a0 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
367b0 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70   to.** MovetoUnp
367c0 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20  acked() to seek 
367d0 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28  cursor pCur to (
367e0 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20  pKey, nKey) has 
367f0 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
36800 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52  performed. seekR
36810 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61  esult is the sea
36820 72 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72  rch result retur
36830 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a  ned (a negative.
36840 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75  ** number if pCu
36850 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65  r points at an e
36860 6e 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61  ntry that is sma
36870 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c  ller than (pKey,
36880 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20   nKey), or.** a 
36890 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
368a0 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  f pCur points at
368b0 20 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73   an etry that is
368c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a   larger than .**
368d0 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20   (pKey, nKey)). 
368e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
368f0 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
36900 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
36910 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
36920 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
36930 2a 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  ** cursor pCur i
36940 73 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  s pointing at th
36950 65 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79 20  e existing copy 
36960 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20 69 73  of a row that is
36970 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
36980 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20 73  itten.  If the s
36990 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
369a0 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63  ter is 0, then c
369b0 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a 2a  ursor pCur may.*
369c0 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 65  * point to any e
369d0 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e  ntry or to no en
369e0 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20 73  try at all and s
369f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
36a00 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74  has to seek.** t
36a10 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65  he cursor before
36a20 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e   the new key can
36a30 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
36a40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
36a50 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
36a60 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
36a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
36a80 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
36a90 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
36aa0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
36ab0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
36ac0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
36ad0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
36ae0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
36af0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
36b00 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
36b10 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
36b20 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
36b30 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
36b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36b50 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
36b60 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
36b70 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
36b80 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36ba0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
36bb0 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
36bc0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  nd */.  int seek
36bd0 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
36be0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
36bf0 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f   of prior Moveto
36c00 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20  Unpacked() call 
36c10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
36c20 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b    int loc = seek
36c30 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
36c40 20 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20 64   /* -1: before d
36c50 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e 20  esired location 
36c60 20 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20 20   +1: after */.  
36c70 69 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20  int szNew = 0;. 
36c80 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
36c90 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
36ca0 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
36cb0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
36cc0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
36cd0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
36ce0 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
36cf0 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
36d00 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
36d10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
36d20 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
36d30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
36d40 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
36d50 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72  _OK );.    retur
36d60 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
36d70 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
36d80 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
36d90 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
36da0 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
36db0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
36dc0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
36dd0 52 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65  RITE && !pBt->re
36de0 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
36df0 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
36e00 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70  heTableLock(p, p
36e10 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
36e20 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30  Cur->pKeyInfo!=0
36e30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  , 2) );..  /* As
36e40 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
36e50 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f  ller has been co
36e60 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69  nsistent. If thi
36e70 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  s cursor was ope
36e80 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69  ned.  ** expecti
36e90 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  ng an index b-tr
36ea0 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ee, then the cal
36eb0 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
36ec0 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a  serting blob.  *
36ed0 2a 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61  * keys with no a
36ee0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
36ef0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  If the cursor wa
36f00 73 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69  s opened expecti
36f10 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65  ng an.  ** intke
36f20 79 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c  y table, the cal
36f30 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
36f40 73 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20  serting integer 
36f50 6b 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a  keys with a.  **
36f60 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61   blob of associa
36f70 74 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20  ted data.  */.  
36f80 61 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30  assert( (pKey==0
36f90 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
36fa0 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
36fb0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
36fc0 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c  sert into a tabl
36fd0 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69  e b-tree, invali
36fe0 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
36ff0 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  b .  ** cursors 
37000 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
37010 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28  being replaced (
37020 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73  assuming this is
37030 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20   a replace.  ** 
37040 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69  operation - if i
37050 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f  t is not, the fo
37060 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d  llowing is a no-
37070 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  op).  */.  if( p
37080 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
37090 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
370a0 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
370b0 73 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20  s(p, nKey, 0);. 
370c0 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
370d0 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
370e0 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
370f0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
37100 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
37110 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
37120 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d  e call to btreeM
37130 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73  oveto() below is
37140 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20   a no-op. For.  
37150 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  ** example, when
37160 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20   inserting data 
37170 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  into a table wit
37180 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  h auto-generated
37190 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65   integer.  ** ke
371a0 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79  ys, the VDBE lay
371b0 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  er invokes sqlit
371c0 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f  e3BtreeLast() to
371d0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
371e0 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65  .  ** integer ke
371f0 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65  y to use. It the
37200 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  n calls this fun
37210 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c  ction to actuall
37220 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20  y insert the .  
37230 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  ** data into the
37240 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20   intkey B-Tree. 
37250 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72  In this case btr
37260 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67  eeMoveto() recog
37270 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  nizes.  ** that 
37280 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
37290 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e  ready where it n
372a0 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72  eeds to be and r
372b0 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20  eturns without. 
372c0 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f   ** doing any wo
372d0 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77  rk. To avoid thw
372e0 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74  arting these opt
372f0 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69  imizations, it i
37300 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a  s important.  **
37310 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68   not to clear th
37320 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20  e cursor here.. 
37330 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41   */.  rc = saveA
37340 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
37350 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
37360 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
37370 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
37380 28 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63  ( !loc ){.    rc
37390 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
373a0 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  Cur, pKey, nKey,
373b0 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f   appendBias, &lo
373c0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
373d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
373e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
373f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
37400 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65  ALID || (pCur->e
37410 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
37420 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b  VALID && loc) );
37430 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
37440 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
37450 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
37460 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
37470 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
37480 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
37490 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e  af || !pPage->in
374a0 74 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45  tKey );..  TRACE
374b0 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
374c0 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
374d0 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
374e0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
374f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
37500 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
37510 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
37520 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
37530 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
37540 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
37550 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
37560 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54  t );.  allocateT
37570 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
37580 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e   newCell = pBt->
37590 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28  pTmpSpace;.  if(
375a0 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
375b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
375c0 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
375d0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
375e0 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
375f0 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
37600 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
37610 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
37620 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
37630 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
37640 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
37650 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
37660 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
37670 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
37680 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  .  idx = pCur->a
37690 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
376a0 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20  ];.  if( loc==0 
376b0 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
376c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
376d0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
376e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
376f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
37700 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
37710 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37720 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
37730 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64  t;.    }.    old
37740 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
37750 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
37760 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
37770 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
37780 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
37790 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
377a0 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
377b0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
377c0 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
377d0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
377e0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64   oldCell);.    d
377f0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
37800 64 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 3b  dx, szOld, &rc);
37810 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
37820 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
37830 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
37840 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
37850 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
37860 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
37870 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  .    idx = ++pCu
37880 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
37890 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page];.  }else{.
378a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
378b0 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20  e->leaf );.  }. 
378c0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
378d0 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
378e0 20 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26 72   szNew, 0, 0, &r
378f0 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  c);.  assert( rc
37900 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
37910 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
37920 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
37930 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  w>0 );..  /* If 
37940 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
37950 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68  ured and pPage h
37960 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  as an overflow c
37970 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  ell, call balanc
37980 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64  e() .  ** to red
37990 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65  istribute the ce
379a0 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  lls within the t
379b0 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e  ree. Since balan
379c0 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20  ce() may move.  
379d0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a  ** the cursor, z
379e0 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72  ero the BtCursor
379f0 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20  .info.nSize and 
37a00 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b  BtCursor.validNK
37a10 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ey.  ** variable
37a20 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65  s..  **.  ** Pre
37a30 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
37a40 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20  f SQLite called 
37a50 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20  moveToRoot() to 
37a60 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a  move the cursor.
37a70 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65    ** back to the
37a80 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61   root page as ba
37a90 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20  lance() used to 
37aa0 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
37ab0 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
37ac0 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b  BtCursor.apPage[
37ad0 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61  ] and BtCursor.a
37ae0 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20  iIdx[]. Instead 
37af0 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20  of doing that,. 
37b00 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73   ** set the curs
37b10 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76  or state to "inv
37b20 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65  alid". This make
37b30 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20  s common insert 
37b40 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  operations.  ** 
37b50 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e  slightly faster.
37b60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65  .  **.  ** There
37b70 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74   is a subtle but
37b80 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d   important optim
37b90 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f  ization here too
37ba0 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  . When inserting
37bb0 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72  .  ** multiple r
37bc0 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69  ecords into an i
37bd0 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69  ntkey b-tree usi
37be0 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73  ng a single curs
37bf0 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20  or (as can.  ** 
37c00 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f  happen while pro
37c10 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45  cessing an "INSE
37c20 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45  RT INTO ... SELE
37c30 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20  CT" statement), 
37c40 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e  it.  ** is advan
37c50 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65  tageous to leave
37c60 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
37c70 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
37c80 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74   entry in.  ** t
37c90 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73  he b-tree if pos
37ca0 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75  sible. If the cu
37cb0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
37cc0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
37cd0 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20  t.  ** entry in 
37ce0 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  the table, and t
37cf0 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65  he next row inse
37d00 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65  rted has an inte
37d10 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72  ger key.  ** lar
37d20 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
37d30 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65  gest existing ke
37d40 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  y, it is possibl
37d50 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a  e to insert the.
37d60 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74    ** row without
37d70 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72   seeking the cur
37d80 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65  sor. This can be
37d90 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
37da0 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20  ce boost..  */. 
37db0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
37dc0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
37dd0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
37de0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37df0 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
37e00 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20  rflow ){.    rc 
37e10 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
37e20 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61  ..    /* Must ma
37e30 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f  ke sure nOverflo
37e40 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65  w is reset to ze
37e50 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62  ro even if the b
37e60 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20  alance().    ** 
37e70 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20  fails. Internal 
37e80 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
37e90 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72  orruption will r
37ea0 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e  esult otherwise.
37eb0 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73   .    ** Also, s
37ec0 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
37ed0 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20  ate to invalid. 
37ee0 54 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43  This stops saveC
37ef0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a  ursorPosition().
37f00 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
37f10 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63  ng to save the c
37f20 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
37f30 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
37f40 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  */.    pCur->apP
37f50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
37f60 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
37f70 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
37f80 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
37f90 49 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ID;.  }.  assert
37fa0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
37fb0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
37fc0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e  erflow==0 );..en
37fd0 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75  d_insert:.  retu
37fe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37ff0 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
38000 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
38010 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
38020 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
38030 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
38040 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20   at a arbitrary 
38050 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
38060 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
38070 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
38080 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20  ur){.  Btree *p 
38090 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
380a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
380b0 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
380c0 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63         .  int rc
380d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
380e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
380f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
38100 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
38110 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
38120 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
38130 74 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66  to delete cell f
38140 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rom */.  unsigne
38150 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20  d char *pCell;  
38160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38170 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
38180 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
38190 69 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20  int iCellIdx;   
381a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
381c0 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
381d0 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65  */.  int iCellDe
381e0 70 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  pth;            
381f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70            /* Dep
38200 74 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61  th of node conta
38210 69 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a  ining pCell */ .
38220 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
38230 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
38240 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
38250 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
38260 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
38270 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
38280 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
38290 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
382a0 46 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74  Flag );.  assert
382b0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
382c0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75  TableLock(p, pCu
382d0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
382e0 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  r->pKeyInfo!=0, 
382f0 32 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  2) );.  assert( 
38300 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
38310 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
38320 6f 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  oot) );..  if( N
38330 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78  EVER(pCur->aiIdx
38340 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
38350 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
38360 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29  ->iPage]->nCell)
38370 20 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43   .   || NEVER(pC
38380 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
38390 4f 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20  OR_VALID).  ){. 
383a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
383b0 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65  _ERROR;  /* Some
383c0 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61  thing has gone a
383d0 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  wry. */.  }..  /
383e0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
383f0 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
38400 74 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20  to remove a row 
38410 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74  from a table b-t
38420 72 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69  ree,.  ** invali
38430 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
38440 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
38450 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20  n the row being 
38460 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69  deleted.  */.  i
38470 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf