/ Hex Artifact Content
Login

Artifact fcfff21fb259fc5f09d8ae65478c3240553f4cd9:


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 3c 3d 30 20 7c 7c 20 70 67 6e 6f 3e 62 74 72  o<=0 || pgno>btr
ce50: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
ce60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ce70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ce80: 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 62  PT;.  }.  rc = b
ce90: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
cea0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
ceb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
cec0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
ced0: 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
cee0: 28 2a 70 70 50 61 67 65 29 3b 0a 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 72 65 6c 65 61 73   ){.      releas
cf10: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
cf20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
cf30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cf40: 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
cf50: 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
cf60: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
cf70: 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
cf80: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
cf90: 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
cfa0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
cfb0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
cfc0: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
cfd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
cfe0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
cff0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d000: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
d010: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d020: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
d030: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
d040: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
d050: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d060: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
d070: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
d080: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
d090: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d0a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d0b0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d0c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d0d0: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
d0e0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
d0f0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
d100: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
d110: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
d120: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
d130: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
d140: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
d150: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
d160: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
d170: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
d180: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
d190: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
d1a0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
d1b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d1c0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d1d0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
d1e0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
d1f0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
d200: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
d210: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
d220: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
d230: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
d240: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
d250: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
d260: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
d270: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
d280: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
d290: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d2a0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
d2b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d2c0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d2d0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
d2e0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
d2f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d300: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d310: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d320: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
d330: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
d340: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d350: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d360: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
d370: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
d380: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
d390: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
d3a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
d3b0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
d3c0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
d3d0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
d3e0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
d3f0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
d400: 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
d410: 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
d420: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
d430: 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
d440: 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
d450: 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
d460: 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
d470: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
d480: 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
d490: 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
d4a0: 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
d4b0: 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
d4c0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
d4d0: 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
d4e0: 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
d4f0: 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
d500: 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
d510: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
d520: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d530: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
d540: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
d550: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
d560: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
d570: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
d580: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
d590: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
d5a0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
d5b0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
d5c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d5d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d5e0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
d5f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d600: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d610: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
d620: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
d630: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
d640: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
d650: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
d660: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
d670: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
d680: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
d690: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
d6a0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
d6b0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
d6c0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
d6d0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
d6e0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
d6f0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
d700: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
d710: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
d720: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
d730: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
d740: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
d750: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
d760: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
d770: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
d780: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
d790: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
d7a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
d7b0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
d7c0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d7d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
d7e0: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
d7f0: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
d800: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
d810: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
d820: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
d830: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
d840: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
d850: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
d860: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
d870: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
d880: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d890: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
d8a0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
d8b0: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
d8c0: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
d8d0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
d8e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d8f0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
d900: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
d910: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
d920: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
d930: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
d940: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
d950: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
d960: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
d970: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
d980: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d990: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
d9a0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
d9b0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d9d0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
d9e0: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
d9f0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
da00: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
da10: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
da20: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
da30: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
da50: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
da60: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
da70: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
da80: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
da90: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
daa0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
dab0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
dae0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
daf0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
db00: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
db10: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
db20: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
db30: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
db40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
db50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
db60: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
db70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
db80: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
dbb0: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
dbc0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
dbd0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
dbe0: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
dbf0: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
dc00: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
dc10: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
dc20: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
dc30: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
dc40: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
dc50: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
dc60: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
dc70: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
dc80: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
dc90: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
dca0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
dcb0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
dcc0: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
dcd0: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
dce0: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
dcf0: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
dd00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
dd10: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
dd20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dd30: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
dd40: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
dd50: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
dd60: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
dd70: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
dd80: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
dd90: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
dda0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
ddb0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
ddc0: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
ddd0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
dde0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
ddf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
de00: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
de10: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
de20: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
de30: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
de40: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
de50: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
de60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
de80: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
de90: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
dea0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
deb0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
dec0: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
ded0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
dee0: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
def0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
df00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
df10: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
df20: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
df30: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
df40: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
df50: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
df60: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
df70: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
df80: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
df90: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
dfa0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
dfb0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
dfc0: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
dfd0: 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  0 && zFilename &
dfe0: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
dff0: 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
e000: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e010: 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
e020: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
e030: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
e040: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
e050: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
e060: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e070: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
e080: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
e090: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
e0a0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
e0b0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e0c0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
e0d0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e0e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e0f0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
e100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e110: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
e120: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
e130: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
e140: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
e150: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
e160: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
e170: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
e180: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
e190: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
e1a0: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
e1b0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e1c0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
e1d0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
e1e0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
e1f0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
e200: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
e210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e220: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
e230: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
e240: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
e250: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
e260: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
e270: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
e280: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
e290: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
e2a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e2b0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
e2c0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
e2d0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
e2e0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
e300: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
e310: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
e320: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
e330: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
e340: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
e350: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
e360: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
e370: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
e380: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
e390: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
e3a0: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
e3b0: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
e3c0: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
e3d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e3e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e3f0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
e400: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e410: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e420: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e440: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e450: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
e460: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e490: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
e4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e4b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
e4c0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
e4d0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
e4e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
e4f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
e500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e510: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e520: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e530: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e540: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e550: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
e560: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
e570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
e580: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
e590: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
e5a0: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
e5b0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
e5c0: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
e5d0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
e5e0: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
e5f0: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
e600: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
e610: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
e620: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
e630: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e640: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
e650: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
e660: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
e670: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e680: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e690: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e6a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
e6b0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
e6c0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
e6d0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
e6e0: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
e6f0: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
e700: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
e710: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
e720: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
e730: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
e740: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
e750: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
e760: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
e770: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
e780: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
e790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e7a0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
e7b0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
e7c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e7d0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
e7e0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
e7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e800: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
e810: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e820: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
e830: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e840: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
e850: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
e860: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
e870: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
e880: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e890: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e8a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e8b0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e8c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e8d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e8e0: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
e8f0: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
e900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e910: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
e920: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
e930: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
e940: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
e950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e970: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
e980: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
e990: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
e9a0: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
e9b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
e9c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e9d0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
e9e0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
e9f0: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
ea00: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ea10: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
ea20: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
ea30: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
ea40: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
ea50: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
ea60: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
ea70: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
ea80: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
ea90: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
eaa0: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
eab0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
eac0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
ead0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
eae0: 20 20 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65     pBt->secureDe
eaf0: 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  lete = 1;.#endif
eb00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
eb10: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
eb20: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
eb30: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
eb40: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
eb50: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
eb60: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
eb70: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
eb80: 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
eb90: 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
eba0: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
ebb0: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
ebc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ebd0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
ebe0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
ebf0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
ec00: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
ec10: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
ec20: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
ec30: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
ec40: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
ec50: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
ec60: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
ec70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
ec80: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
ec90: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
eca0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
ecb0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
ecc0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
ecd0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
ece0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
ecf0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
ed00: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
ed10: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
ed20: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
ed30: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
ed40: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
ed50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
ed60: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
ed70: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
ed80: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ed90: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
eda0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
edb0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
edc0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
edd0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
ede0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
edf0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
ee00: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
ee10: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
ee20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
ee30: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
ee40: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
ee50: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
ee60: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
ee70: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ee80: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
ee90: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
eea0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
eeb0: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
eec0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
eed0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
eee0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
eef0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
ef00: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
ef10: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ef20: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
ef30: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
ef40: 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
ef50: 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
ef60: 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
ef70: 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
ef80: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
ef90: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
efa0: 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
efb0: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
efc0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
efd0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
efe0: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
eff0: 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
f000: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
f010: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
f020: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f030: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
f040: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
f050: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
f060: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
f070: 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
f080: 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
f090: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
f0a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f0b0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
f0c0: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d  ared;.      pBt-
f0d0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
f0e0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
f0f0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
f100: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
f110: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
f120: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
f130: 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
f140: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
f150: 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
f160: 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
f170: 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
f180: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
f190: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
f1a0: 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
f1b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f1c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
f1d0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
f1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f1f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
f200: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f210: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
f220: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f230: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
f240: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
f250: 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
f260: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
f270: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
f280: 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
f290: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
f2a0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
f2b0: 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
f2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f2d0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
f2e0: 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
f2f0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
f300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f310: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
f320: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
f330: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
f340: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
f350: 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
f360: 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
f370: 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
f380: 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
f390: 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
f3a0: 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
f3b0: 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
f3c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
f3d0: 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
f3e0: 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
f3f0: 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
f400: 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
f410: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
f420: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
f430: 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
f440: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f450: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
f460: 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
f470: 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
f480: 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
f490: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
f4a0: 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
f4b0: 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
f4c0: 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
f4d0: 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
f4e0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
f4f0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
f500: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
f510: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
f520: 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
f530: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
f540: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
f550: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
f560: 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
f570: 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
f580: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
f590: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
f5a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f5b0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
f5c0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
f5d0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
f5e0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
f5f0: 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
f600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f610: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
f620: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
f630: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
f640: 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
f650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
f660: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
f670: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
f680: 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
f690: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
f6a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f6b0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
f6c0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
f6d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f6e0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
f6f0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
f700: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f710: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
f720: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
f730: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
f740: 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
f750: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f760: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f770: 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
f780: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
f790: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f7a0: 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
f7b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
f7c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
f7d0: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
f7e0: 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
f7f0: 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
f800: 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
f810: 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
f820: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
f830: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
f840: 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
f850: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
f860: 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
f870: 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
f880: 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
f890: 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
f8a0: 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
f8b0: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
f8c0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
f8d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f8e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
f8f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
f900: 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61  pMaster;.  BtSha
f910: 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
f920: 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
f930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f940: 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
f950: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
f960: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
f970: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
f980: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
f990: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
f9a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f9b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
f9c0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
f9d0: 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
f9e0: 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
f9f0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fa00: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
fa10: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
fa20: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fa30: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fa40: 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
fa50: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
fa60: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
fa70: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fa80: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fa90: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
faa0: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
fab0: 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
fac0: 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
fad0: 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
fae0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
faf0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
fb00: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
fb10: 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
fb20: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
fb30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fb40: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
fb50: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
fb60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
fb70: 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
fb80: 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
fb90: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
fba0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
fbb0: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
fbc0: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
fbd0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
fbe0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
fbf0: 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
fc00: 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
fc10: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
fc20: 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
fc30: 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
fc40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
fc50: 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
fc60: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
fc70: 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
fc80: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
fc90: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
fca0: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
fcb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
fcc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
fcd0: 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
fce0: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
fcf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fd00: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
fd10: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
fd20: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
fd30: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
fd40: 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
fd50: 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
fd60: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
fd70: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
fd80: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
fd90: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
fda0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
fdb0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
fdc0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
fdd0: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
fde0: 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
fdf0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
fe00: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
fe10: 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
fe20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fe30: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
fe40: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
fe50: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
fe60: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
fe70: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
fe80: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
fe90: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
fea0: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
feb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
fec0: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
fed0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fee0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
fef0: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
ff00: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
ff10: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
ff20: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
ff30: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
ff40: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
ff50: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ff60: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
ff70: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
ff80: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
ff90: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
ffa0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
ffb0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
ffc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ffd0: 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
ffe0: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
fff0: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
10000 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
10010 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10020 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
10030 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
10040 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
10050 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
10060 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
10070 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
10080 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10090 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
100a0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
100b0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
100c0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
100d0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
100e0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
100f0 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
10100 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
10110 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
10120 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
10130 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
10140 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
10150 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
10160 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
10170 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
10180 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
10190 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
101a0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
101b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
101c0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
101d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
101e0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
101f0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
10200 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
10210 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
10220 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
10230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
10240 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10250 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10260 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10270 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10290 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
102a0 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
102b0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
102c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
102d0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
102e0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
102f0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10300 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10310 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10320 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10330 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10340 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10360 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10370 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10390 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
103a0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
103b0 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
103c0 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
103d0 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
103e0 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
103f0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10400 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10410 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10420 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10430 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10440 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10450 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10460 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10470 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10480 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10490 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
104a0 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
104b0 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
104c0 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
104d0 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
104e0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
104f0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10500 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10510 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10520 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10530 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10540 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10550 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10560 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10570 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10580 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10590 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
105a0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
105b0 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
105c0 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
105d0 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
105e0 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
105f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10600 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10610 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10620 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10630 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
10640 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
10650 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10660 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10670 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10680 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10690 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
106a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
106b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
106c0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
106d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
106e0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
106f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10720 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
10730 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
10740 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
10750 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
10760 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
10770 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
10780 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
10790 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
107a0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
107b0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
107c0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
107d0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
107e0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
107f0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
10800 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10810 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
10820 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
10830 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
10840 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
10850 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
10860 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
10870 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
10880 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
10890 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
108a0 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
108b0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
108c0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
108d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
108e0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
108f0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
10900 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
10910 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
10920 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
10930 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
10940 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10950 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10960 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
10970 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
10980 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10990 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
109a0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
109b0 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
109c0 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
109d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
109e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
109f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10a00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
10a10 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
10a20 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
10a30 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
10a40 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
10a50 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
10a60 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
10a70 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
10a80 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
10a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10aa0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
10ab0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
10ac0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10ad0 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
10ae0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10af0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10b00 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
10b10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10b20 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
10b30 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
10b40 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
10b50 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
10b60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10b70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10b80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10b90 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
10ba0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
10bb0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
10bc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10bd0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
10be0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
10bf0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
10c00 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
10c10 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
10c20 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
10c30 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
10c40 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
10c50 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
10c60 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
10c70 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
10c80 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
10c90 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
10ca0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
10cb0 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
10cc0 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
10cd0 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
10ce0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
10cf0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
10d00 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
10d10 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
10d20 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
10d30 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
10d40 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
10d50 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
10d60 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
10d70 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
10d80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10d90 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
10da0 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
10db0 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
10dc0 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
10dd0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
10de0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
10df0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
10e00 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
10e10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
10e20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
10e30 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
10e40 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
10e50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
10e60 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
10e70 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
10e80 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
10e90 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
10ea0 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
10eb0 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78 65  the pageSizeFixe
10ec0 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  d flag is set so
10ed0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
10ee0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
10ef0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
10f00 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
10f10 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
10f20 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
10f30 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
10f40 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
10f50 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
10f60 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
10f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
10f80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10f90 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
10fa0 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
10fb0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
10fc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10fd0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
10fe0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
11000 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11020 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
11030 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
11040 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
11050 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
11060 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11070 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11080 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
11090 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
110a0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
110b0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
110c0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
110d0 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
110e0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
110f0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
11100 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11110 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11120 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
11130 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
11140 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
11150 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
11160 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
11170 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
11180 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
11190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
111a0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
111b0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
111c0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
111d0 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
111e0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
111f0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
11200 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
11210 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ) pBt->pageSize
11220 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  Fixed = 1;.  sql
11230 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11240 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11260 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
11270 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
11280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11290 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
112a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
112b0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
112c0 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
112d0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
112e0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
112f0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
11300 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
11310 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
11320 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
11330 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
11340 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
11350 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
11360 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
11370 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sions..*/.int sq
11380 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
11390 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
113a0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
113b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
113c0 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
113d0 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
113e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
113f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11400 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
11410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11420 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
11430 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
11440 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
11450 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
11460 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
11470 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
11480 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
11490 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
114a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
114b0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
114c0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
114d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
114e0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
114f0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
11500 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
11510 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11520 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11530 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
11540 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
11550 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
11560 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
11570 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11580 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
11590 20 53 65 74 20 74 68 65 20 73 65 63 75 72 65 44   Set the secureD
115a0 65 6c 65 74 65 20 66 6c 61 67 20 69 66 20 6e 65  elete flag if ne
115b0 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
115c0 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
115d0 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
115e0 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
115f0 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
11600 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63  value of the sec
11610 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20 73 65 74  ureDelete.** set
11620 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
11630 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
11640 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
11650 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
11660 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
11670 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
11680 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11690 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
116a0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
116b0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
116c0 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c  ->pBt->secureDel
116d0 65 74 65 20 3d 20 28 6e 65 77 46 6c 61 67 21 3d  ete = (newFlag!=
116e0 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 20  0) ? 1 : 0;.  } 
116f0 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74 2d 3e 73  .  b = p->pBt->s
11700 65 63 75 72 65 44 65 6c 65 74 65 3b 0a 20 20 73  ecureDelete;.  s
11710 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11720 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
11730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
11740 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11750 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
11760 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
11770 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
11780 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
11790 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
117a0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
117b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
117c0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
117d0 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
117e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
117f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
11800 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
11810 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
11820 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
11830 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
11840 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
11850 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
11860 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
11870 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
11880 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
11890 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
118a0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
118b0 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
118c0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
118d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
118e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
118f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
11900 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
11910 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11920 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
11930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11940 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
11950 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
11960 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11970 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
11980 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20  izeFixed && (av 
11990 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
119a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
119b0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
119c0 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
119d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
119e0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
119f0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11a00 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
11a10 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
11a20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11a30 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
11a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11a50 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
11a60 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
11a70 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
11a80 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
11a90 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
11aa0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
11ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11ac0 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
11ad0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
11ae0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11af0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
11b00 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
11b10 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
11b20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
11b30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11b40 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
11b50 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
11b60 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
11b70 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
11b80 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
11b90 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
11ba0 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
11bb0 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
11bc0 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
11bd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11be0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
11bf0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
11c00 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
11c10 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
11c20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11c30 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
11c40 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
11c50 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
11c60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
11c70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11c80 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
11c90 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
11ca0 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
11cb0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
11cc0 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
11cd0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
11ce0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
11cf0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
11d00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
11d10 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
11d20 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
11d30 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
11d40 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
11d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
11d60 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
11d70 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
11d80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11d90 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
11da0 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
11db0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
11dc0 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
11dd0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
11de0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
11df0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
11e00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11e10 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
11e20 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
11e30 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
11e40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
11e50 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
11e60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
11e70 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
11e80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11e90 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
11ea0 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
11eb0 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
11ec0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11ed0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11ee0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11ef0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
11f00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11f10 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
11f20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
11f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f40 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
11f50 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
11f60 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
11f70 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
11f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
11f90 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
11fa0 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
11fb0 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
11fc0 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
11fd0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
11fe0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
11ff0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
12000 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
12010 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
12020 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
12030 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 28 72  aData);.  if( (r
12040 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12050 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
12060 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
12070 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  e))!=SQLITE_OK )
12080 7b 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  {;.    goto page
12090 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
120a0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d   }.  if( nPage==
120b0 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
120c0 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
120d0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
120e0 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
120f0 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
12100 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
12110 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
12120 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
12130 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
12140 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
12150 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
12160 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
12170 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12180 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12190 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
121a0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
121b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
121c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
121d0 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20  ge1[19]>2 ){.   
121e0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
121f0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12200 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
12210 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73  write version is
12220 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20   set to 2, this 
12230 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
12240 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20  be accessed.    
12250 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
12260 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f  If the log is no
12270 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
12280 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65  open it now. The
12290 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  n .    ** return
122a0 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
122b0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f  eturn without po
122c0 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65  pulating BtShare
122d0 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a  d.pPage1..    **
122e0 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65   The caller dete
122f0 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c  cts this and cal
12300 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
12310 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a   again. This is.
12320 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
12330 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f  as the version o
12340 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74  f page 1 current
12350 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20  ly in the page1 
12360 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61  buffer.    ** ma
12370 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74  y not be the lat
12380 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68  est version - th
12390 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77  ere may be a new
123a0 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f  er one in the lo
123b0 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20  g.    ** file.. 
123c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61     */.    if( pa
123d0 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42  ge1[19]==2 && pB
123e0 74 2d 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d  t->doNotUseWAL==
123f0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
12400 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
12410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12420 65 72 4f 70 65 6e 4c 6f 67 28 70 42 74 2d 3e 70  erOpenLog(pBt->p
12430 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
12440 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12460 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12470 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
12480 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
12490 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
124a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
124b0 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ge1);.        re
124c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
124d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
124e0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
124f0 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
12500 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
12510 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
12520 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
12530 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
12540 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
12550 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
12560 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
12570 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
12580 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
12590 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
125a0 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
125b0 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
125c0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
125d0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
125e0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
125f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
12600 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
12610 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
12620 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
12630 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
12640 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
12650 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
12660 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b  yte(&page1[16]);
12670 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
12680 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
12690 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c  !=0 || pageSize<
126a0 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  512 ||.        (
126b0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
126c0 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61  SIZE<32768 && pa
126d0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
126e0 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20  X_PAGE_SIZE).   
126f0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12700 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
12720 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
12730 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
12740 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
12750 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
12760 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
12770 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
12780 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
12790 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
127a0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
127b0 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
127c0 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
127d0 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
127e0 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
127f0 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
12800 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
12810 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
12820 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
12830 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
12840 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
12850 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
12860 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
12870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
12880 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
12890 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
128a0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
128b0 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
128c0 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
128d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
128e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
128f0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
12900 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
12910 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
12920 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
12930 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
12940 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
12950 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
12960 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12970 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
12980 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
12990 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
129c0 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
129d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
129e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
129f0 28 20 6e 50 61 67 65 48 65 61 64 65 72 3e 6e 50  ( nPageHeader>nP
12a00 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
12a10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
12a20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
12a30 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12a40 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
12a50 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
12a60 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
12a70 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12a80 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
12a90 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
12aa0 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
12ab0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
12ac0 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
12ad0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
12ae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12af0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
12b00 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
12b10 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
12b20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
12b30 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
12b40 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
12b50 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
12b60 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
12b70 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
12b80 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
12b90 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
12ba0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
12bb0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
12bc0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
12bd0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
12be0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
12bf0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
12c00 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
12c10 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
12c20 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
12c30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
12c40 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
12c50 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
12c60 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
12c70 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
12c80 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
12c90 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
12ca0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
12cb0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
12cc0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
12cd0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
12ce0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
12cf0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
12d00 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
12d10 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
12d20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
12d30 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68  byte poiner, a h
12d40 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
12d50 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
12d60 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
12d70 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
12d80 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
12d90 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
12da0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
12db0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
12dc0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
12dd0 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
12de0 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
12df0 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  3;.  pBt->minLoc
12e00 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
12e10 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
12e20 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61   - 23;.  pBt->ma
12e30 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61  xLeaf = pBt->usa
12e40 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20  bleSize - 35;.  
12e50 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
12e60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
12e70 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
12e80 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12e90 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
12ea0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
12eb0 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
12ec0 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70  e1 = pPage1;.  p
12ed0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
12ee0 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
12ef0 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
12f00 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
12f10 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
12f20 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
12f30 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
12f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
12f50 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12f60 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
12f70 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
12f80 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
12f90 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
12fa0 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
12fb0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
12fc0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
12fd0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
12fe0 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
12ff0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
13000 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
13010 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
13020 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
13030 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
13040 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
13050 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
13060 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
13070 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13080 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
13090 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
130a0 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
130b0 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
130c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
130d0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
130e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
130f0 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c  t->pCursor==0 ||
13100 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13110 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
13120 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
13130 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
13140 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
13150 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
13160 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
13170 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
13180 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13190 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
131a0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
131b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
131c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
131d0 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
131e0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
131f0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
13200 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1 = 0;.  }.}../*
13210 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
13220 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
13230 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
13240 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
13250 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
13260 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
13270 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
13280 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
13290 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
132a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
132b0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
132c0 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
132d0 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
132e0 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
132f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
13300 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13310 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
13320 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
13330 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
13340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13350 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
13360 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
13370 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
13380 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
13390 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
133a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
133b0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
133c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
133d0 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
133e0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
133f0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
13400 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
13410 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
13420 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
13430 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
13440 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
13450 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
13460 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
13470 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
13480 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
13490 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
134a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
134b0 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
134c0 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
134d0 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
134e0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
134f0 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
13500 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
13510 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
13520 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
13530 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
13540 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
13550 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
13560 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
13570 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
13580 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
13590 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
135a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
135b0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
135c0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
135d0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
135e0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
135f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
13600 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
13610 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
13620 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
13630 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
13640 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13650 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
13660 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
13670 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
13680 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
13690 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
136a0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
136b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
136c0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
136d0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
136e0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
136f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
13700 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
13710 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13720 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
13730 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
13740 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
13750 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
13760 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
13770 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
13780 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
13790 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
137a0 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
137b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
137c0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
137d0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
137e0 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
137f0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
13800 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
13810 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
13820 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
13830 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
13840 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
13850 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
13860 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
13870 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
13880 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
13890 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
138a0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
138b0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
138c0 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
138d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
138e0 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
138f0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
13900 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
13910 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
13920 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
13930 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
13940 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
13950 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
13960 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13970 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
13980 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13990 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
139a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
139b0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
139c0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
139d0 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
139e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
139f0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
13a00 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
13a10 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
13a20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
13a30 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
13a40 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
13a50 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
13a60 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
13a70 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
13a80 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
13a90 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
13aa0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
13ab0 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
13ac0 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
13ad0 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
13ae0 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
13af0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
13b00 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
13b10 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
13b20 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
13b30 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13b40 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
13b50 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
13b60 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
13b70 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
13b80 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
13b90 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
13ba0 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
13bb0 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
13bc0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
13bd0 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
13be0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
13bf0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
13c00 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
13c10 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
13c20 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
13c30 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
13c40 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
13c50 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
13c60 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
13c70 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
13c80 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
13c90 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
13ca0 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
13cb0 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
13cc0 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
13cd0 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
13ce0 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
13cf0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
13d00 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
13d10 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
13d20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
13d30 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
13d40 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
13d50 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
13d60 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
13d70 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
13d80 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
13d90 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
13da0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
13db0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
13dc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13dd0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
13de0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
13df0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13e00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
13e10 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
13e20 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
13e30 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
13e40 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
13e50 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13e60 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
13e70 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
13e80 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
13e90 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
13ea0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
13eb0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
13ec0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
13ed0 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
13ee0 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
13ef0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
13f00 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
13f10 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
13f20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
13f30 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
13f40 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
13f50 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
13f60 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
13f70 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
13f80 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
13f90 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
13fa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13fb0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13fc0 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
13fd0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13fe0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
13ff0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
14000 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
14010 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
14020 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
14030 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
14040 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
14050 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
14060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
14070 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
14080 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
14090 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
140a0 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
140b0 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a  t->isPending ){.
140c0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
140d0 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
140e0 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
140f0 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
14100 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
14110 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
14120 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
14130 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
14140 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
14150 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
14160 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
14170 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
14180 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
141a0 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
141b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
141c0 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
141d0 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
141e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
141f0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
14200 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
14210 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
14220 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
14230 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
14240 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
14250 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
14260 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
14270 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
14280 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
14290 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
142a0 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
142b0 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
142c0 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
142d0 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
142e0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
142f0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
14300 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
14310 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
14320 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
14330 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
14340 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14350 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c  ..  pBt->initial
14360 6c 79 45 6d 70 74 79 20 3d 20 70 42 74 2d 3e 6e  lyEmpty = pBt->n
14370 50 61 67 65 3d 3d 30 3b 0a 20 20 64 6f 20 7b 0a  Page==0;.  do {.
14380 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
14390 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
143a0 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
143b0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
143c0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
143d0 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
143e0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
143f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
14400 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
14410 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
14420 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
14430 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
14440 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
14450 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
14460 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
14470 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
14480 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
14490 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
144a0 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
144b0 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
144c0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
144d0 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
144e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
144f0 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
14500 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
14510 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
14520 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
14530 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
14540 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
14550 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
14560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14570 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
14580 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
14590 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
145a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
145b0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
145c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
145d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
145e0 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
145f0 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
14600 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
14610 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
14620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14630 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
14640 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
14650 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
14660 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14670 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14690 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
146a0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
146b0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
146c0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
146d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
146e0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
146f0 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
14700 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
14710 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  pBt) );..  if( r
14720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14730 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
14740 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
14750 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
14760 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
14770 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14780 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14790 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
147a0 62 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20  ble ){..assert( 
147b0 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
147c0 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
147d0 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
147e0 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
147f0 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
14800 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
14810 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
14820 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
14830 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
14840 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
14850 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
14860 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
14870 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
14880 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
14890 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
148a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
148b0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
148c0 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
148d0 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66  Trans;.    }.#if
148e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
148f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14900 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
14910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
14920 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
14930 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
14940 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
14950 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
14960 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a  (u8)(wrflag>1);.
14970 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
14980 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
14990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
149a0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
149b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
149c0 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
149d0 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
149e0 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
149f0 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
14a00 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
14a10 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
14a20 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
14a30 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
14a40 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
14a50 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
14a60 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
14a70 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
14a80 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
14a90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14aa0 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
14ab0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
14ac0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
14ad0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
14ae0 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
14af0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14b00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14b10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14b20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14b30 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14b40 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
14b50 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
14b60 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
14b70 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
14b80 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
14b90 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
14ba0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
14bb0 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
14bc0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
14bd0 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
14be0 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
14bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14c00 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
14c10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
14c20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
14c50 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
14c60 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
14c90 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
14ca0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14cd0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
14ce0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14cf0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
14d00 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
14d10 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
14d20 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
14d30 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
14d40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14d50 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
14d60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
14d70 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
14d80 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
14d90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14da0 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
14db0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
14dc0 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
14dd0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
14de0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
14df0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
14e00 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
14e10 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
14e20 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
14e30 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
14e40 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
14e50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
14e60 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
14e70 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
14e80 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
14e90 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
14ea0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
14eb0 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
14ec0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
14ed0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
14ee0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
14ef0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
14f00 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
14f10 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
14f20 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
14f30 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
14f40 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
14f50 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73  no, &rc);.  }..s
14f60 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
14f70 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
14f80 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
14f90 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
14fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
14fb0 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
14fc0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
14fd0 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
14fe0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
14ff0 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
15000 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
15010 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
15020 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
15030 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
15040 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
15050 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
15060 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
15070 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
15080 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
15090 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
150a0 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
150b0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
150c0 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
150d0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
150e0 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
150f0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
15100 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
15110 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
15140 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
15150 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
15160 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
15170 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
15180 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
15190 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
151a0 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
151b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
151c0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
151d0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
151e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
151f0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
15200 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
15210 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
15220 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
15230 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
15240 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15250 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
15260 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
15270 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
15280 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
15290 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
152a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
152b0 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
152c0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
152d0 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
152e0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
152f0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
15300 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
15310 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
15320 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
15330 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15340 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
15350 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
15360 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
15370 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
15380 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
15390 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
153a0 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
153b0 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
153c0 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61  .    btreeInitPa
153d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e  ge(pPage);.    n
153e0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
153f0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
15400 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
15410 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
15420 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
15430 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
15440 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
15450 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
15460 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
15470 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  fo;.        btre
15480 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
15490 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
154a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
154b0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
154c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
154d0 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
154e0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
154f0 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20  rflow]) ){.     
15500 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
15510 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
15520 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
15530 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15540 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
15560 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
15570 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
15580 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
15590 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
155a0 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
155b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
155c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
155d0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
155e0 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
155f0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
15600 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
15610 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
15620 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
15630 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
15640 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
15650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15660 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
15670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
15680 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
15690 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
156a0 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
156b0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
156c0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
156d0 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
156e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
156f0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
15700 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
15710 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
15720 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
15730 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
15740 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
15750 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
15760 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
15770 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
15780 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
15790 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
157a0 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
157b0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
157c0 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
157d0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
157e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
157f0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
15800 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
15810 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
15820 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
15830 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
15840 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
15850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15860 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
15870 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
15880 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
15890 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
158a0 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
158b0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
158c0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
158d0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
158e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
158f0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
15900 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
15910 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
15920 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
15930 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
15940 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
15950 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
15960 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
15970 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
15980 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
15990 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
159a0 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
159b0 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
159c0 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
159d0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
159e0 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
159f0 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
15a00 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
15a10 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
15a20 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
15a30 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
15a40 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
15a50 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
15a60 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
15a70 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
15a80 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
15a90 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
15aa0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
15ab0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
15ac0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
15ad0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
15ae0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
15af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
15b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15b10 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
15b20 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
15b30 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
15b40 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
15b50 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
15b60 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
15b70 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
15b80 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
15b90 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
15ba0 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
15bb0 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
15bc0 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
15bd0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
15be0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
15bf0 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
15c00 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
15c10 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
15c20 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
15c30 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
15c40 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
15c50 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15c60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
15c70 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
15c80 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
15c90 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
15ca0 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
15cb0 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
15cc0 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
15cd0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
15ce0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
15cf0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
15d00 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
15d10 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
15d20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
15d30 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
15d40 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
15d50 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
15d60 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
15d70 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
15d80 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
15d90 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
15da0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
15db0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
15dc0 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
15dd0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
15de0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
15df0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
15e00 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
15e10 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
15e20 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
15e30 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
15e40 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
15e50 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
15e60 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
15e70 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
15e80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
15e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15ea0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15eb0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
15ec0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
15ed0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
15ee0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
15ef0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
15f00 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  l!=0 ){.      pt
15f10 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
15f20 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
15f30 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
15f40 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ge, &rc);.      
15f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15f60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
15f70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
15f80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15f90 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
15fa0 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
15fb0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
15fc0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
15fd0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
15fe0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
15ff0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
16000 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
16010 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
16020 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
16030 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
16040 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
16050 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
16060 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
16070 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
16080 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
160a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
160b0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
160c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
160d0 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
160e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
160f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16100 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
16110 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
16120 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16130 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
16140 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
16150 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
16160 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
16170 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
16180 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
16190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
161a0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
161b0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
161c0 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
161d0 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  ge, &rc);.    }.
161e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
161f0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
16200 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
16210 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
16220 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
16230 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
16240 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
16250 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
16260 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
16270 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
16280 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
16290 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
162a0 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
162b0 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74  ccessful,.** ret
162c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
162d0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
162e0 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
162f0 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f  erefore no.** po
16300 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74  int in calling t
16310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
16320 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
16330 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d  TE_DONE..**.** M
16340 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
16350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
16360 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
16370 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61  anize the .** da
16380 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
16390 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
163a0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
163b0 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20  ly in use.** is 
163c0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
163d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
163e0 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  Fin parameter is
163f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
16400 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
16410 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c  .** that the cal
16420 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
16430 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
16440 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20  Step() until.** 
16450 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
16460 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72  E_DONE or an err
16470 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69  or, and that nFi
16480 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  n is the.** numb
16490 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20  er of pages the 
164a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
164b0 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72  ll contain after
164c0 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73   this .** proces
164d0 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20 20  s is complete.  
164e0 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
164f0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
16500 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63 75 75  hat.** incrVacuu
16510 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62 65 20  mStep() will be 
16520 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74 65 20  called a finite 
16530 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 73 0a  amount of times.
16540 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  ** which may or 
16550 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20 74 68  may not empty th
16560 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41 20 66  e freelist.  A f
16570 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d 0a 2a  ull autovacuum.*
16580 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20 20 41  * has nFin>0.  A
16590 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65   "PRAGMA increme
165a0 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68 61 73  ntal_vacuum" has
165b0 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74 61   nFin==0..*/.sta
165c0 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
165d0 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
165e0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
165f0 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a   Pgno iLastPg){.
16600 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
16610 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
16620 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
16630 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
16640 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
16650 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
16660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16670 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
16680 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
16690 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
166a0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
166b0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
166c0 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
166d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
166e0 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
166f0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
16700 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
16710 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
16720 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
16730 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
16740 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
16750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16760 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
16770 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
16780 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
16790 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
167a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
167b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
167c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
167d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
167e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
167f0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
16800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
16810 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
16820 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
16830 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
16840 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46   ){.      if( nF
16850 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  in==0 ){.       
16860 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
16870 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
16880 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
16890 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
168a0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
168b0 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72   nFin is non-zer
168c0 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
168d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
168e0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
168f0 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
16900 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
16910 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
16920 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
16930 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
16940 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
16950 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
16960 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
16970 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16980 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
16990 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
169a0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
169b0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
169c0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
169d0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
169e0 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20  iLastPg, 1);.   
169f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16a10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16a30 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
16a40 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
16a50 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
16a60 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
16a70 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
16a80 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
16a90 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
16aa0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
16ab0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
16ac0 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
16ad0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
16ae0 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg;..      rc = 
16af0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
16b00 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
16b10 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
16b20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16b30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16b40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
16b50 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
16b60 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
16b70 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
16b80 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
16b90 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
16ba0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
16bb0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
16bc0 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
16bd0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
16be0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
16bf0 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
16c00 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
16c10 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
16c20 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
16c30 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
16c40 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
16c50 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
16c60 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
16c70 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
16c80 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
16c90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16ca0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
16cb0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
16cc0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
16cd0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
16ce0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
16cf0 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
16d00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16d10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16d20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
16d30 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
16d40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16d60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
16d70 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
16d80 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
16d90 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
16da0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
16db0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
16dc0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
16dd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16de0 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
16df0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
16e00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16e10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16e20 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
16e30 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
16e40 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
16e50 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a  eePg, nFin!=0);.
16e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
16e70 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
16e80 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
16e90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16ea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16eb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16ec0 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d    }..  if( nFin=
16ed0 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
16ee0 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g--;.    while( 
16ef0 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
16f00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c  _BYTE_PAGE(pBt)|
16f10 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  |PTRMAP_ISPAGE(p
16f20 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
16f30 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41 50        if( PTRMAP
16f40 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
16f50 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20  stPg) ){.       
16f60 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20   MemPage *pPg;. 
16f70 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
16f80 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
16f90 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b  astPg, &pPg, 0);
16fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16fc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16fd0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
16fe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16ff0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
17000 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
17010 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17020 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Pg);.        if(
17030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17040 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
17050 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
17060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17070 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a  LastPg--;.    }.
17080 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
17090 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
170a0 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74  t->pPager, iLast
170b0 50 67 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  Pg);.    pBt->nP
170c0 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
170d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
170e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
170f0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
17100 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
17110 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
17120 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
17130 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
17140 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
17150 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
17160 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
17170 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
17180 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
17190 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
171a0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
171b0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
171c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
171d0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
171e0 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
171f0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
17200 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
17210 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17220 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
17230 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
17240 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
17250 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
17260 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
17270 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
17280 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17290 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
172a0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
172b0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
172c0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
172d0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
172e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
172f0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
17300 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
17310 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
17320 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
17330 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
17340 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
17350 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
17360 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 62  umStep(pBt, 0, b
17370 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
17380 74 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  t));.    if( rc=
17390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
173a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
173b0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
173c0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
173d0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
173e0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
173f0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
17400 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
17410 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17420 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17430 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
17440 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17450 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
17460 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
17470 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
17480 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
17490 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
174a0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
174b0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
174c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
174d0 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
174e0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
174f0 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
17500 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17510 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
17520 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
17530 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
17540 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
17550 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
17560 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
17570 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
17580 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
17590 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
175a0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
175b0 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
175c0 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
175d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
175e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
175f0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
17600 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
17610 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
17620 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
17630 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  unt(pPager) );..
17640 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17650 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17660 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
17670 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
17680 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
17690 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
176a0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
176b0 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
176c0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
176d0 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
176e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
176f0 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
17700 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
17710 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
17720 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17730 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
17740 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
17750 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
17760 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f   nPtrmap;      /
17770 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
17780 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
17790 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
177a0 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
177b0 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
177c0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
177d0 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20     int nEntry;  
177e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
177f0 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
17800 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
17810 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
17820 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
17830 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
17840 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
17850 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
17860 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
17870 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
17880 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
17890 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
178a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
178b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
178c0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
178d0 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
178e0 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
178f0 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
17900 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
17910 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
17920 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
17930 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
17940 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
17950 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
17960 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
17970 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
17980 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17990 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
179a0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
179b0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
179c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
179d0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e  ta[36]);.    nEn
179e0 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
179f0 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74  eSize/5;.    nPt
17a00 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
17a10 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
17a20 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
17a30 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
17a40 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
17a50 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
17a60 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e  ;.    if( nOrig>
17a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17a80 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
17a90 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
17aa0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
17ab0 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Fin--;.    }.   
17ac0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
17ad0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
17ae0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
17af0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
17b00 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
17b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17b20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
17b30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17b40 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f  PT_BKPT;..    fo
17b50 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
17b60 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
17b70 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
17b80 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
17b90 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
17ba0 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
17bb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17bc0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
17bd0 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
17be0 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
17bf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
17c00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
17c10 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
17c20 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
17c30 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
17c40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
17c50 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
17c60 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
17c70 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
17c80 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
17c90 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
17ca0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
17cb0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
17cc0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
17cd0 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  ->pPager, nFin);
17ce0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
17cf0 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
17d00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
17d20 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
17d30 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
17d40 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
17d50 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50  ( nRef==sqlite3P
17d60 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
17d70 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
17d80 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
17d90 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
17da0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
17db0 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
17dc0 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
17dd0 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
17de0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17df0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
17e00 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
17e10 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
17e20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
17e30 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
17e40 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
17e50 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
17e60 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
17e70 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
17e80 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
17e90 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
17ea0 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
17eb0 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
17ec0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
17ed0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
17ee0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
17ef0 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
17f00 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
17f10 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
17f20 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
17f30 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
17f40 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
17f50 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
17f60 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
17f70 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
17f80 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
17f90 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
17fa0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
17fb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17fc0 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
17fd0 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
17fe0 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
17ff0 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
18000 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
18010 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
18020 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
18030 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
18040 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
18050 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
18060 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
18070 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
18080 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
18090 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
180a0 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
180b0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
180c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
180d0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
180e0 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
180f0 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
18100 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
18110 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
18120 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
18130 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
18140 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
18150 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
18160 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
18170 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18180 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
18190 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
181a0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
181b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
181c0 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
181d0 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
181e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
181f0 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
18200 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
18210 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
18220 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
18230 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
18240 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
18250 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
18260 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
18270 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
18280 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
18290 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
182a0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
182b0 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
182c0 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
182d0 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
182e0 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
182f0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
18300 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
18310 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
18320 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
18330 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18340 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
18350 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
18360 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
18370 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18380 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
18390 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
183a0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
183b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
183c0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
183d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
183e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
183f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
18400 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
18410 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
18420 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
18430 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
18440 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18450 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
18460 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18470 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
18480 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18490 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
184a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
184b0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
184c0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
184d0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
184e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
184f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18500 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
18510 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
18520 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
18530 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
18540 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
18550 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
18560 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
18570 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
18580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
18590 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
185a0 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
185b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
185c0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
185d0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
185e0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
185f0 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
18600 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69  ontent(pBt);.  i
18610 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
18620 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64  ANS_NONE && p->d
18630 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
18640 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
18650 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
18660 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
18670 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
18680 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
18690 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
186a0 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
186b0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
186c0 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
186d0 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
186e0 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
186f0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
18700 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
18710 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
18720 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
18730 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
18740 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
18750 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
18760 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
18770 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
18780 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
18790 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
187a0 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
187b0 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
187c0 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
187d0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
187e0 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
187f0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
18800 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
18810 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
18820 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
18830 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
18840 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
18850 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
18860 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
18870 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
18880 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
18890 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
188a0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
188b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
188c0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
188d0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
188e0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
188f0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
18900 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
18910 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
18920 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
18930 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
18940 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
18950 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
18960 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
18970 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
18980 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
18990 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
189a0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
189b0 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
189c0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
189d0 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
189e0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
189f0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
18a00 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
18a10 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
18a20 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
18a30 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
18a40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18a50 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
18a60 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
18a70 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
18a80 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
18a90 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
18aa0 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
18ab0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
18ac0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
18ad0 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
18ae0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
18af0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18b00 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
18b10 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
18b20 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
18b30 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
18b40 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
18b50 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
18b60 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
18b70 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
18b80 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
18b90 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
18ba0 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
18bb0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
18bc0 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
18bd0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
18be0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
18bf0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
18c00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
18c10 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
18c20 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
18c30 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
18c40 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
18c50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
18c60 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
18c70 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
18c80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
18c90 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
18ca0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
18cb0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
18cc0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
18cd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18ce0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18cf0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
18d00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18d10 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
18d20 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18d30 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
18d40 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
18d50 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
18d60 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
18d70 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
18d80 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
18d90 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
18da0 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
18db0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
18dc0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
18dd0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
18de0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
18df0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
18e00 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
18e10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
18e20 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
18e30 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
18e40 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
18e50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18e60 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
18e70 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
18e80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18e90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18eb0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
18ec0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18ed0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
18ee0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
18ef0 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
18f00 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
18f10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18f20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18f30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18f40 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
18f50 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
18f60 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18f70 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
18f80 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
18f90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18fa0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
18fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
18fc0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
18fd0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
18ff0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
19000 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29  ommitPhaseTwo(p)
19010 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
19020 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19030 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
19040 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
19050 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
19060 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
19070 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
19080 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
19090 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
190a0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
190b0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
190c0 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
190d0 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
190e0 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
190f0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
19100 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
19110 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
19120 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
19130 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
19140 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
19150 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
19160 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
19170 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
19180 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
19190 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
191a0 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
191b0 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
191c0 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
191d0 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
191e0 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
191f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
19200 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
19210 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
19220 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
19230 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
19240 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
19250 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
19260 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
19270 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
19280 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
19290 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
192a0 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
192b0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
192c0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
192d0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
192e0 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
192f0 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
19300 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
19310 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
19320 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
19330 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
19340 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
19350 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
19360 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
19370 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
19380 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
19390 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
193a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
193b0 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
193c0 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
193d0 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
193e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
193f0 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
19400 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
19410 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
19420 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
19430 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
19440 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
19450 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
19460 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
19470 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
19480 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
19490 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
194a0 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
194b0 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
194c0 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
194d0 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
194e0 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
194f0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
19500 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
19510 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
19520 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
19530 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
19540 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
19550 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
19560 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
19570 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
19580 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19590 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
195a0 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
195b0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
195c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
195d0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
195e0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
195f0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
19600 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
19610 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
19620 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
19630 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
19640 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
19650 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19660 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
19670 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
19680 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
19690 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
196a0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
196b0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
196c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
196d0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
196e0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
196f0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
19700 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
19710 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
19720 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
19730 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
19740 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
19750 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
19760 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
19770 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
19780 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
19790 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
197a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
197b0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
197c0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
197d0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
197e0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
197f0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
19800 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19810 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
19820 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
19830 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19840 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
19850 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
19860 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19870 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61  er(p);.  rc = sa
19880 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
19890 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
198a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
198b0 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
198c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
198d0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
198e0 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
198f0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
19900 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
19910 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20  curred whilst.  
19920 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73    ** trying to s
19930 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ave cursor posit
19940 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73  ions. If this is
19950 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f   an automatic ro
19960 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a  llback (as.    *
19970 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
19980 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61  a constraint, ma
19990 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f  lloc() failure o
199a0 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e  r IO error) then
199b0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63   .    ** the cac
199c0 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e  he may be intern
199d0 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ally inconsisten
199e0 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76  t (not contain v
199f0 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20  alid trees) so. 
19a00 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
19a10 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
19a20 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63  e error to the c
19a30 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20  aller. Instead, 
19a40 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c  abort .    ** al
19a50 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  l queries that m
19a60 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20  ay be using any 
19a70 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
19a80 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61  hat failed to sa
19a90 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ve..    */.    s
19aa0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
19ab0 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29  llCursors(p, rc)
19ac0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
19ad0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
19ae0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
19af0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19b00 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
19b10 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
19b20 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
19b30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
19b40 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
19b50 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19b60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
19b70 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
19b80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
19b90 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
19ba0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
19bb0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
19bc0 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
19bd0 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
19be0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
19bf0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
19c00 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
19c10 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
19c20 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
19c30 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
19c40 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
19c50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
19c60 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
19c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c80 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
19c90 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
19ca0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
19cb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
19cc0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
19cd0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
19ce0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19cf0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
19d00 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
19d10 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
19d20 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
19d30 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
19d40 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
19d50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
19d60 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
19d70 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
19d80 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
19d90 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
19da0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
19db0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
19dc0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
19dd0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
19de0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19df0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19e00 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
19e10 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
19e20 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
19e30 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
19e40 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
19e50 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
19e60 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
19e70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
19e80 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
19e90 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
19ea0 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
19eb0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
19ec0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
19ed0 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
19ee0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
19ef0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
19f00 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
19f10 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
19f20 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
19f30 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
19f40 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
19f50 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
19f60 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
19f70 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
19f80 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
19f90 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
19fa0 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
19fb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
19fc0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
19fd0 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
19fe0 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
19ff0 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
1a000 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
1a010 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
1a020 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
1a030 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1a040 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
1a050 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
1a060 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1a070 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
1a080 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
1a090 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
1a0a0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1a0b0 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
1a0c0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
1a0d0 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
1a0e0 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
1a0f0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1a100 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
1a110 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
1a120 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1a130 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
1a140 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
1a150 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
1a160 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
1a170 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
1a180 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
1a190 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
1a1a0 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
1a1b0 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
1a1c0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
1a1d0 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
1a1e0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1a1f0 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
1a200 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1a210 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
1a220 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1a230 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1a240 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a250 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1a260 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
1a270 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1a280 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61  assert( pBt->rea
1a290 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
1a2a0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
1a2b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1a2c0 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
1a2d0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
1a2e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1a2f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a300 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
1a310 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
1a320 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
1a330 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
1a340 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
1a350 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
1a360 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
1a370 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
1a380 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
1a390 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
1a3a0 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
1a3b0 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
1a3c0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1a3d0 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
1a3e0 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
1a3f0 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
1a400 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
1a410 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1a420 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
1a430 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1a440 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1a450 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
1a460 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1a470 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1a480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a490 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
1a4a0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1a4b0 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
1a4c0 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
1a4d0 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
1a4e0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
1a4f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
1a500 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
1a510 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
1a520 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
1a530 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
1a540 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
1a550 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
1a560 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
1a570 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
1a580 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
1a590 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
1a5a0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
1a5b0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
1a5c0 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
1a5d0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
1a5e0 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
1a5f0 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
1a600 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
1a610 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
1a620 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1a630 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
1a640 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
1a650 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
1a660 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
1a670 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
1a680 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
1a690 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
1a6a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
1a6b0 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
1a6c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1a6d0 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
1a6e0 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
1a6f0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
1a700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a710 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
1a720 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a730 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1a740 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1a750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
1a760 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
1a770 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
1a780 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
1a790 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
1a7a0 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
1a7b0 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
1a7c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1a7d0 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
1a7e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a7f0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
1a800 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
1a810 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1a820 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
1a830 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1a840 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a850 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
1a860 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e 69 74 69  <0 && pBt->initi
1a870 61 6c 6c 79 45 6d 70 74 79 20 29 20 70 42 74 2d  allyEmpty ) pBt-
1a880 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
1a890 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1a8a0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1a8b0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1a8c0 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1a8d0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1a8e0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1a8f0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1a900 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
1a910 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1a920 67 65 72 2c 20 28 69 6e 74 2a 29 26 70 42 74 2d  ger, (int*)&pBt-
1a930 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  >nPage);.      }
1a940 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a950 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a960 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1a980 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
1a990 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
1a9a0 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
1a9b0 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
1a9c0 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
1a9d0 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
1a9e0 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
1a9f0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
1aa00 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
1aa10 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
1aa20 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1aa30 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
1aa40 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
1aa50 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
1aa60 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1aa70 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
1aa80 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
1aa90 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
1aaa0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
1aab0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tion..**.** If w
1aac0 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
1aad0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
1aae0 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
1aaf0 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
1ab00 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
1ab10 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
1ab20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1ab30 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
1ab40 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
1ab50 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
1ab60 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
1ab70 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
1ab80 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
1ab90 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
1aba0 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
1abb0 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
1abc0 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
1abd0 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
1abe0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1abf0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
1ac00 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
1ac10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1ac20 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
1ac30 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
1ac40 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
1ac50 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
1ac60 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
1ac70 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
1ac80 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
1ac90 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
1aca0 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
1acb0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
1acc0 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
1acd0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
1ace0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
1acf0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
1ad00 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
1ad10 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
1ad20 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
1ad30 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1ad40 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
1ad50 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
1ad60 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
1ad70 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
1ad80 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
1ad90 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
1ada0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
1adb0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  ion..**.** No ch
1adc0 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
1add0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1ade0 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
1adf0 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
1ae00 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
1ae10 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
1ae20 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
1ae30 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
1ae40 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
1ae50 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
1ae60 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1ae70 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
1ae80 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68  eeCursorZero() h
1ae90 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a  as been called.*
1aea0 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69  * on pCur to ini
1aeb0 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
1aec0 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74  ry space prior t
1aed0 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
1aee0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
1aef0 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
1af00 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af30 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1af40 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af60 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1af70 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1af80 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1af90 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afb0 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1afc0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1afd0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1afe0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1aff0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1b000 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
1b010 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
1b020 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
1b050 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
1b060 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
1b070 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b090 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
1b0a0 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  andle */..  asse
1b0b0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1b0c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1b0d0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1b0e0 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
1b0f0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  1 );..  /* The f
1b100 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
1b110 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
1b120 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
1b130 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
1b140 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
1b150 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
1b160 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
1b170 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
1b180 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
1b190 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
1b1a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
1b1b0 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
1b1c0 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
1b1d0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
1b1e0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
1b1f0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
1b200 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
1b210 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
1b220 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20  , wrFlag+1) );. 
1b230 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1b240 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
1b250 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
1b260 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
1b270 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
1b280 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
1b290 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
1b2a0 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
1b2b0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
1b2c0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
1b2d0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1b2e0 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
1b2f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1b300 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
1b310 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
1b320 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a  age1->aData );..
1b330 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c    if( NEVER(wrFl
1b340 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f  ag && pBt->readO
1b350 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nly) ){.    retu
1b360 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
1b370 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  LY;.  }.  if( iT
1b380 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
1b390 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
1b3a0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b3b0 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
1b3c0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
1b3d0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
1b3e0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
1b3f0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
1b400 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
1b410 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
1b420 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
1b430 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
1b440 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
1b450 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
1b460 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
1b470 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
1b480 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
1b490 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
1b4a0 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
1b4b0 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
1b4c0 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  t;.  pCur->wrFla
1b4d0 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a  g = (u8)wrFlag;.
1b4e0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
1b4f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
1b500 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1b510 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
1b520 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1b530 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
1b540 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
1b550 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1b560 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1b570 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1b580 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
1b590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1b5a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1b5b0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
1b5f0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b620 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1b630 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1b640 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1b680 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1b690 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1b6a0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b6c0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
1b6d0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
1b6e0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1b710 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
1b720 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1b730 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b740 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1b750 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
1b760 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
1b770 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
1b780 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b790 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b7a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1b7b0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
1b7c0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1b7d0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
1b7e0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
1b7f0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
1b800 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
1b810 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
1b820 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
1b830 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
1b840 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
1b850 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
1b860 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
1b870 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
1b880 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
1b890 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
1b8a0 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
1b8b0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
1b8c0 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
1b8d0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1b8e0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
1b8f0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
1b900 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
1b910 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1b920 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
1b930 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
1b940 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
1b950 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
1b960 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
1b970 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
1b980 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
1b990 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
1b9a0 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
1b9b0 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
1b9c0 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
1b9d0 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
1b9e0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
1b9f0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
1ba00 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
1ba10 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
1ba20 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
1ba30 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
1ba40 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1ba50 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
1ba60 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
1ba70 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1ba80 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
1ba90 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
1baa0 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
1bab0 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
1bac0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1bad0 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75  ached rowid valu
1bae0 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f  e of every curso
1baf0 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  r in the same da
1bb00 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
1bb10 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e  s pCur and havin
1bb20 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20  g the same root 
1bb30 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70  page number as p
1bb40 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  Cur.  The value 
1bb50 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f  is.** set to iRo
1bb60 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  wid..**.** Only 
1bb70 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76  positive rowid v
1bb80 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1bb90 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74  ered valid for t
1bba0 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68  his cache..** Th
1bbb0 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69  e cache is initi
1bbc0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20  alized to zero, 
1bbd0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
1bbe0 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20  valid cache..** 
1bbf0 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72  A btree will wor
1bc00 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f  k fine with zero
1bc10 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1bc20 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61  ids.  We just ca
1bc30 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65  nnot.** cache ze
1bc40 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1bc50 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61  owids, which mea
1bc60 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75  ns tables that u
1bc70 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65  se zero or.** ne
1bc80 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69  gative rowids mi
1bc90 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
1bca0 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e   slower.  But in
1bcb0 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a   practice, zero.
1bcc0 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ** or negative r
1bcd0 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75  owids are very u
1bce0 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20  ncommon so this 
1bcf0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
1bd00 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
1bd10 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1bd20 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1bd30 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69  rsor *pCur, sqli
1bd40 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
1bd50 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1bd60 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e  ;.  for(p=pCur->
1bd70 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd80 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1bd90 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bda0 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t==pCur->pgnoRoo
1bdb0 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77  t ) p->cachedRow
1bdc0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  id = iRowid;.  }
1bdd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1bde0 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52  >cachedRowid==iR
1bdf0 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owid );.}../*.**
1be00 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68   Return the cach
1be10 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
1be20 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20   given cursor.  
1be30 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65  A negative or ze
1be40 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  ro.** return val
1be50 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
1be60 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  t the rowid cach
1be70 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64  e is invalid and
1be80 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67   should be.** ig
1be90 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72  nored.  If the r
1bea0 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e  owid cache has n
1beb0 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1bec0 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20   set, then a.** 
1bed0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1bee0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1bef0 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  64 sqlite3BtreeG
1bf00 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1bf10 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1bf20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61   return pCur->ca
1bf30 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  chedRowid;.}../*
1bf40 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1bf50 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
1bf60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1bf70 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
1bf80 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
1bf90 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
1bfa0 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
1bfb0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
1bfc0 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
1bfd0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
1bfe0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
1bff0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
1c000 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
1c010 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1c020 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1c030 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1c040 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1c050 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c060 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1c070 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1c080 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
1c090 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
1c0a0 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
1c0b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c0c0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
1c0d0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1c0e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1c0f0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1c100 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1c110 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
1c120 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
1c130 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1c140 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1c150 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1c160 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1c170 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
1c180 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1c190 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
1c1a0 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1c1b0 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
1c1c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1c1d0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1c1e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1c1f0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1c200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c210 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1c220 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
1c230 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1c240 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
1c250 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1c260 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
1c270 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1c280 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
1c290 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1c2a0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
1c2b0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
1c2c0 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
1c2d0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
1c2e0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
1c2f0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
1c300 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
1c310 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
1c320 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
1c330 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
1c340 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
1c350 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
1c360 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
1c370 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
1c380 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
1c390 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
1c3a0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
1c3b0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1c3c0 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
1c3d0 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
1c3e0 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
1c3f0 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
1c400 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
1c410 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
1c420 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
1c430 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
1c440 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
1c450 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
1c460 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
1c470 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
1c480 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
1c490 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1c4a0 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
1c4b0 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
1c4c0 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
1c4d0 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
1c4e0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1c4f0 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
1c500 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
1c510 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1c520 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1c530 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1c540 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1c550 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
1c560 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
1c570 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1c580 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1c590 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
1c5a0 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
1c5b0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
1c5c0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
1c5d0 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
1c5e0 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
1c5f0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
1c600 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
1c610 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
1c620 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
1c630 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
1c640 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
1c650 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
1c660 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
1c670 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
1c680 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
1c690 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1c6a0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1c6b0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
1c6c0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65  .      int iPage
1c6d0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1c6e0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
1c6f0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1c700 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1c710 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1c720 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
1c730 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1c740 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1c750 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
1c760 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1c770 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
1c780 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
1c790 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
1c7a0 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
1c7b0 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
1c7c0 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
1c7d0 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
1c7e0 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
1c7f0 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1c830 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1c840 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20  Size==0 ){      
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1c880 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1c890 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20  Cur->iPage;     
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1c8d0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1c8e0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1c8f0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1c900 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1c910 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43  >info); \.    pC
1c920 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1c930 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1c940 20 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 5c 0a 20 20 7d 65 6c           \.  }el
1c970 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20            \.    
1c9c0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1c9d0 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 7d             \.  }
1ca10 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
1ca20 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  VER */..#ifndef 
1ca30 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
1ca40 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
1ca50 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
1ca60 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1ca70 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
1ca80 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
1ca90 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
1caa0 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
1cab0 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
1cac0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
1cad0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
1cae0 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
1caf0 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
1cb00 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
1cb10 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
1cb20 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
1cb30 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1cb40 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
1cb50 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1cb60 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
1cb70 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1cb80 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
1cb90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1cba0 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
1cbb0 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
1cbc0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1cbd0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1cbe0 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
1cbf0 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
1cc00 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
1cc10 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
1cc20 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
1cc30 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1cc40 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
1cc50 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
1cc60 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
1cc70 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
1cc80 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
1cc90 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
1cca0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1ccb0 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
1ccc0 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
1ccd0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
1cce0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1ccf0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
1cd00 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
1cd10 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
1cd20 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1cd30 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
1cd40 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
1cd50 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
1cd60 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
1cd70 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
1cd80 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
1cd90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
1cda0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1cdb0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1cdc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1cdd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1cde0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1cdf0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
1ce00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1ce10 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ID );.  if( pCur
1ce20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
1ce30 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
1ce40 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Size = 0;.  }els
1ce50 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  e{.    getCellIn
1ce60 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70  fo(pCur);.    *p
1ce70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1ce80 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65  o.nKey;.  }.  re
1ce90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cea0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
1ceb0 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
1cec0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1ced0 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
1cee0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
1cef0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1cf00 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  o..**.** The cal
1cf10 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
1cf20 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
1cf30 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1cf40 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
1cf50 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
1cf60 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1cf70 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
1cf80 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
1cf90 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
1cfa0 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
1cfb0 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
1cfc0 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69  VALID..**.** Fai
1cfd0 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
1cfe0 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63  ible.  This func
1cff0 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75  tion always retu
1d000 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
1d010 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20  * It might just 
1d020 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f  as well be a pro
1d030 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e  cedure (returnin
1d040 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63  g void) but we c
1d050 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65  ontinue.** to re
1d060 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
1d070 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20  result code for 
1d080 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
1d090 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
1d0a0 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
1d0b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d0c0 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  u32 *pSize){.  a
1d0d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1d0e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1d0f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1d100 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d110 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
1d120 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1d130 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1d140 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74  nfo.nData;.  ret
1d150 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d160 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1d170 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1d180 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1d190 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1d1a0 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
1d1b0 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
1d1c0 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
1d1d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1d1e0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1d1f0 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
1d200 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
1d210 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
1d220 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
1d230 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
1d240 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
1d250 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
1d260 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
1d270 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
1d280 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
1d290 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
1d2a0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1d2b0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1d2c0 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
1d2d0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1d2e0 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
1d2f0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1d300 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
1d310 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
1d320 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
1d330 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
1d340 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
1d350 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
1d360 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
1d370 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
1d380 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
1d390 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
1d3a0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
1d3b0 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
1d3c0 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
1d3d0 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
1d3e0 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
1d3f0 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
1d400 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
1d410 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
1d420 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
1d430 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
1d440 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
1d450 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
1d460 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
1d470 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
1d480 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
1d490 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
1d4a0 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
1d4b0 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
1d4c0 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
1d4d0 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
1d4e0 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
1d4f0 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
1d500 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
1d510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d520 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1d530 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d550 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1d560 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
1d570 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
1d580 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1d590 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1d5a0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
1d5b0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
1d5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1d5d0 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
1d5e0 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
1d5f0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
1d600 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
1d610 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
1d620 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1d630 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
1d640 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
1d650 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
1d660 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d670 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1d680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d690 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1d6a0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
1d6b0 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
1d6c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d6d0 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
1d6e0 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
1d6f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1d700 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
1d710 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
1d720 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
1d730 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
1d740 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
1d750 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
1d760 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
1d770 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
1d780 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
1d790 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
1d7a0 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
1d7b0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
1d7c0 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
1d7d0 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
1d7e0 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
1d7f0 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
1d800 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
1d810 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1d820 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1d830 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
1d840 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
1d850 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
1d860 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
1d870 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1d880 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
1d890 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1d8a0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1d8b0 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
1d8c0 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
1d8d0 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
1d8e0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
1d8f0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1d900 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
1d910 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
1d920 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d930 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
1d940 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
1d950 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
1d960 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
1d970 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
1d980 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1d990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d9a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1d9b0 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
1d9c0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1d9d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1d9e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1d9f0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1da00 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
1da10 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  e, 0);.    asser
1da20 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1da30 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
1da40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1da50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
1da60 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
1da70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1da80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
1da90 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
1daa0 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
1dab0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
1dac0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1dad0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1dae0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1daf0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1db00 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
1db10 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
1db20 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
1db30 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
1db40 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
1db50 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
1db60 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
1db70 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
1db80 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
1db90 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1dba0 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
1dbb0 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
1dbc0 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
1dbd0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1dbe0 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
1dbf0 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
1dc00 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
1dc10 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
1dc20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
1dc30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1dc40 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
1dc50 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
1dc60 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
1dc70 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
1dc80 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1dc90 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
1dca0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1dcb0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1dcc0 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
1dcd0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1dce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1dcf0 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
1dd00 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
1dd10 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1dd20 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
1dd30 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd50 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
1dd60 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
1dd70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1dd80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1dd90 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
1dda0 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1ddc0 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
1ddd0 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
1dde0 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
1ddf0 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
1de00 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
1de10 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
1de20 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
1de30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
1de40 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
1de50 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
1de60 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
1de70 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1de80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1de90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1dea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1deb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1dec0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
1ded0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
1dee0 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
1def0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
1df00 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
1df10 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
1df20 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
1df30 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1df40 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
1df50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1df60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1df70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1df80 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
1df90 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
1dfa0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
1dfb0 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
1dfc0 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
1dfd0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
1dfe0 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20  ting to. If the 
1dff0 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  eOp.** parameter
1e000 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61   is 0, this is a
1e010 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20   read operation 
1e020 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74  (data copied int
1e030 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
1e040 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d  ). If it is non-
1e050 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64  zero, a write (d
1e060 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  ata copied from.
1e070 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1e080 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
1e090 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
1e0a0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1e0b0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
1e0c0 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
1e0d0 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
1e0e0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1e0f0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
1e100 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
1e110 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
1e120 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
1e130 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
1e140 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
1e150 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
1e160 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
1e170 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72  .** If the BtCur
1e180 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sor.isIncrblobHa
1e190 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
1e1a0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
1e1b0 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72  t.** cursor entr
1e1c0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
1e1d0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
1e1e0 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
1e1f0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70  .** allocates sp
1e200 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
1e210 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65  ly popluates the
1e220 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1e230 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72  ist .** cache ar
1e240 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
1e250 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71  verflow). Subseq
1e260 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
1e270 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20  his.** cache to 
1e280 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
1e290 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
1e2a0 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65  set more efficie
1e2b0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
1e2c0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1e2d0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
1e2e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
1e2f0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
1e300 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
1e310 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
1e320 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
1e330 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
1e340 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
1e350 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
1e360 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
1e370 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
1e380 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
1e390 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
1e3a0 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
1e3b0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
1e3c0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
1e3d0 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
1e3e0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
1e3f0 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
1e400 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
1e410 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
1e420 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
1e430 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
1e440 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
1e450 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
1e460 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
1e470 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
1e480 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
1e490 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1e4a0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
1e4b0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
1e4c0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
1e4d0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
1e4e0 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
1e4f0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
1e500 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
1e510 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
1e520 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
1e530 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1e540 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
1e550 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
1e560 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
1e570 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
1e580 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
1e590 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
1e5a0 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
1e5b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1e5c0 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
1e5d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e5e0 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
1e5f0 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d   iIdx = 0;.  Mem
1e600 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
1e610 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1e620 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65  >iPage]; /* Btre
1e630 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e  e page of curren
1e640 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53  t entry */.  BtS
1e650 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1e660 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  r->pBt;         
1e670 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
1e680 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65  e this cursor be
1e690 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
1e6a0 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
1e6b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e6c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e6d0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1e6e0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1e6f0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1e700 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
1e710 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e720 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
1e730 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1e740 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
1e750 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
1e760 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
1e770 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20  nHeader;.  nKey 
1e780 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  = (pPage->intKey
1e790 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72   ? 0 : (int)pCur
1e7a0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
1e7b0 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65   if( NEVER(offse
1e7c0 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
1e7d0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a  r->info.nData) .
1e7e0 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1e7f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e800 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1e810 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1e820 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1e830 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1e840 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1e850 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1e860 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1e870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e880 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e890 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1e8a0 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1e8b0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1e8c0 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1e8d0 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1e8e0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1e8f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1e900 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1e910 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1e920 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1e930 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1e940 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1e950 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1e960 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1e970 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1e980 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1e990 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1e9a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1e9b0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1e9c0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1e9d0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1e9e0 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1e9f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1ea00 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1ea10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1ea20 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1ea30 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1ea40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1ea50 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1ea60 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1ea70 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1ea80 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1ea90 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1eaa0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1eab0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1eac0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1ead0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1eae0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1eaf0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1eb00 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1eb10 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1eb20 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1eb30 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1eb40 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1eb50 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1eb60 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1eb70 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1eb80 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1eb90 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1eba0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1ebb0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1ebc0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1ebd0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1ebe0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1ebf0 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1ec00 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1ec10 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1ec20 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1ec30 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1ec40 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1ec50 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1ec60 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1ec70 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1ec80 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1ec90 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1eca0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1ecb0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1ecc0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1ecd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1ece0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1ecf0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1ed00 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1ed10 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1ed20 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1ed30 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1ed40 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20      /* nOvfl is 
1ed50 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
1ed60 20 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72    If it were zer
1ed70 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20  o, fetchPayload 
1ed80 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20  would have.     
1ed90 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e   ** been used in
1eda0 73 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f  stead of this ro
1edb0 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20  utine. */.      
1edc0 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c  if( ALWAYS(nOvfl
1edd0 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  ) && !pCur->aOve
1ede0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
1edf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ee00 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1ee10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1ee20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1ee30 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1ee40 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
1ee50 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
1ee60 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
1ee70 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
1ee80 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
1ee90 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
1eea0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
1eeb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
1eec0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
1eed0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
1eee0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
1eef0 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
1ef00 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
1ef10 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
1ef20 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
1ef30 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
1ef40 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
1ef50 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
1ef60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
1ef70 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
1ef80 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
1ef90 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
1efa0 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
1efb0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1efc0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
1efd0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
1efe0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1eff0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
1f000 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
1f010 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1f020 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
1f030 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1f040 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
1f050 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
1f060 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1f070 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1f080 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
1f090 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
1f0a0 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
1f0b0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
1f0c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1f0d0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
1f0e0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
1f0f0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
1f100 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
1f110 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
1f120 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1f130 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
1f140 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1f150 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
1f160 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
1f170 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
1f180 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
1f190 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
1f1a0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
1f1b0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
1f1c0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
1f1d0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
1f1e0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
1f1f0 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
1f200 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1f210 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
1f220 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1f230 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
1f240 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
1f250 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
1f260 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
1f270 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
1f280 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
1f290 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
1f2a0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
1f2b0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
1f2c0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
1f2d0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
1f2e0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
1f2f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f300 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
1f310 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
1f320 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
1f330 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
1f340 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
1f350 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
1f360 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
1f370 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
1f380 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
1f390 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
1f3a0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
1f3b0 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
1f3c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1f3d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1f3e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
1f3f0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
1f400 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1f410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f420 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
1f430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1f440 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
1f450 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
1f460 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
1f470 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
1f480 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
1f490 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
1f4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
1f4b0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
1f4c0 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
1f4d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
1f4e0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1f4f0 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
1f500 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
1f510 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f520 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1f530 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
1f540 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
1f550 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
1f560 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
1f570 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
1f580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f590 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1f5a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f5b0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
1f5c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f5d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
1f5e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f5f0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1f600 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
1f610 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
1f620 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
1f630 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
1f640 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
1f650 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
1f660 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
1f670 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
1f680 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  "..**.** The cal
1f690 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
1f6a0 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
1f6b0 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
1f6c0 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74   row.** in the t
1f6d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  able..**.** Retu
1f6e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1f6f0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
1f700 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
1f710 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1f720 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
1f730 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
1f740 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
1f750 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
1f760 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
1f770 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1f780 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
1f790 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
1f7a0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
1f7b0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
1f7c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f7d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f7e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f7f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f800 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1f810 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
1f820 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
1f830 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1f840 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f850 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1f860 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1f870 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1f880 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
1f890 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1f8a0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1f8b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1f8c0 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
1f8d0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
1f8e0 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
1f8f0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1f900 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1f910 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1f920 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1f930 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1f940 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1f950 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1f960 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
1f970 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1f980 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
1f990 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
1f9a0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1f9b0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
1f9c0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
1f9d0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
1f9e0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
1f9f0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
1fa00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fa10 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
1fa20 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
1fa30 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
1fa40 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
1fa50 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
1fa60 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1fa70 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
1fa80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1fa90 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
1faa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
1fab0 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
1fac0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1fad0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1fae0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1faf0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1fb00 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1fb10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fb20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1fb30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1fb40 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1fb50 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1fb60 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1fb70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1fb80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1fb90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1fba0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
1fbb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1fbc0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
1fbd0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
1fbe0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
1fbf0 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
1fc00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1fc10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1fc20 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
1fc30 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
1fc40 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
1fc50 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
1fc60 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1fc70 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
1fc80 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
1fc90 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
1fca0 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
1fcb0 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
1fcc0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
1fcd0 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
1fce0 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
1fcf0 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
1fd00 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
1fd10 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
1fd20 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
1fd30 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
1fd40 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
1fd50 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
1fd60 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
1fd70 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
1fd80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1fd90 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
1fda0 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
1fdb0 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
1fdc0 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
1fdd0 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
1fde0 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
1fdf0 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
1fe00 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
1fe10 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
1fe20 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
1fe30 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
1fe40 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
1fe50 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
1fe60 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
1fe70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
1fe80 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
1fe90 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
1fea0 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
1feb0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
1fec0 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
1fed0 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65  eassemble.** the
1fee0 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
1fef0 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
1ff00 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
1ff10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
1ff20 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
1ff30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
1ff40 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
1ff50 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
1ff60 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1ff70 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
1ff80 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
1ff90 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
1ffa0 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
1ffb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1ffc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
1ffd0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ffe0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
1fff0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
20000 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
20010 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
20020 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
20030 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
20040 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
20050 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
20060 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
20070 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
20080 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
20090 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
200a0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
200b0 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
200c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
200d0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
200e0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
200f0 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c  2 nKey;.  u32 nL
20100 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
20110 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
20120 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
20130 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20140 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
20150 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
20160 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
20170 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
20180 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
20190 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  r) );.  pPage = 
201a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
201b0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
201c0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
201d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
201e0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
201f0 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
20200 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29  info.nSize==0) )
20210 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
20220 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
20230 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20  e[pCur->iPage], 
20240 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20250 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20  ->iPage],.      
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43               &pC
20270 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20  ur->info);.  }. 
20280 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
20290 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
202a0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
202b0 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
202c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
202d0 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
202e0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
202f0 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43    nKey = (int)pC
20300 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
20310 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
20320 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
20330 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
20340 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
20350 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
20360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
20370 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
20380 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73  o.nLocal;.    as
20390 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b  sert( nLocal<=nK
203a0 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d  ey );.  }.  *pAm
203b0 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  t = nLocal;.  re
203c0 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d  turn aPayload;.}
203d0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
203e0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
203f0 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
20400 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
20410 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
20420 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
20430 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
20440 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
20450 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
20460 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
20470 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
20480 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
20490 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
204a0 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
204b0 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
204c0 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
204d0 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
204e0 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
204f0 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
20500 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
20510 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
20520 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
20530 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
20540 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
20550 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
20560 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
20570 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
20580 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
20590 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
205a0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
205b0 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
205c0 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
205d0 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
205e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
205f0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
20600 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
20610 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
20620 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
20630 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
20640 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
20650 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
20660 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  *p = 0;.  assert
20670 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20680 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
20690 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
206a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
206b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
206c0 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
206d0 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  S(pCur->eState==
206e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b  CURSOR_VALID) ){
206f0 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20  .    p = (const 
20700 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
20710 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
20720 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20730 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  p;.}.const void 
20740 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
20750 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
20760 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
20770 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
20780 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  *p = 0;.  assert
20790 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
207a0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
207b0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
207c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
207d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
207e0 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
207f0 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  S(pCur->eState==
20800 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b  CURSOR_VALID) ){
20810 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20  .    p = (const 
20820 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
20830 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31  ad(pCur, pAmt, 1
20840 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20850 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  p;.}.../*.** Mov
20860 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
20870 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
20880 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
20890 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
208a0 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
208b0 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
208c0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
208d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
208e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
208f0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
20900 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
20910 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
20920 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
20930 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
20940 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
20950 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
20960 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
20970 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
20980 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
20990 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
209a0 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
209b0 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
209c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
209d0 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
209e0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
209f0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
20a00 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
20a10 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
20a20 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
20a30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
20a40 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
20a50 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20a60 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20a70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20a80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20a90 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20aa0 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
20ab0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
20ac0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
20ad0 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
20ae0 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
20af0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20b00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20b10 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
20b20 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
20b30 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
20b40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
20b50 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
20b60 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
20b70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
20b80 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
20b90 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
20ba0 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
20bb0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
20bc0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
20bd0 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
20be0 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65  ->nCell<1 || pNe
20bf0 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70  wPage->intKey!=p
20c00 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
20c10 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
20c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20c30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
20c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20c50 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
20c60 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
20c70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
20c80 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
20c90 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
20ca0 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
20cb0 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
20cc0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
20cd0 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
20ce0 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
20cf0 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
20d00 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
20d10 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
20d20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
20d30 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
20d40 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
20d50 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
20d60 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
20d70 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
20d80 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
20d90 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
20da0 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
20db0 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
20dc0 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
20dd0 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
20de0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
20df0 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
20e00 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
20e10 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
20e20 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
20e30 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
20e40 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
20e50 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
20e60 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
20e70 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
20e80 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
20e90 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
20ea0 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
20eb0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
20ec0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
20ed0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
20ee0 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
20ef0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
20f00 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
20f10 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
20f20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
20f30 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
20f40 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
20f50 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
20f60 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
20f70 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
20f80 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
20f90 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
20fa0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
20fb0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
20fc0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
20fd0 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
20fe0 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
20ff0 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
21000 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
21010 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21020 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
21030 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
21040 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
21050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
21060 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
21070 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21080 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21090 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
210a0 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
210b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
210c0 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
210d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
210e0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
210f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21100 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
21110 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61    );.  releasePa
21120 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
21130 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
21140 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
21150 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
21160 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
21170 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d  validNKey = 0;.}
21180 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
21190 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
211a0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
211b0 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
211c0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
211d0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
211e0 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
211f0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
21200 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
21210 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
21220 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
21230 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
21240 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
21250 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
21260 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
21270 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
21280 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
21290 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
212a0 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
212b0 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
212c0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
212d0 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
212e0 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
212f0 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
21300 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
21310 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
21320 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
21330 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
21340 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
21350 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
21360 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
21370 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
21380 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
21390 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
213a0 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
213b0 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
213c0 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
213d0 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
213e0 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
213f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
21400 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
21410 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
21420 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
21430 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
21440 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
21450 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
21460 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
21470 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
21480 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
21490 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
214a0 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
214b0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
214c0 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
214d0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
214e0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
214f0 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
21500 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
21510 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
21520 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
21530 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
21540 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
21550 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
21560 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
21570 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
21580 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
21590 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
215a0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
215b0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
215c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
215d0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
215e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
215f0 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70  E_OK;.  Btree *p
21600 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
21610 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21620 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
21630 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21640 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21650 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
21660 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
21670 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
21680 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
21690 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
216a0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
216b0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
216c0 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
216d0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
216e0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
216f0 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
21700 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
21710 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
21720 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
21730 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21740 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
21750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
21760 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
21770 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d  >skipNext;.    }
21780 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
21790 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
217a0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
217b0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
217c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
217d0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
217e0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
217f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21800 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
21810 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
21820 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
21830 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
21840 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
21850 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
21860 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
21870 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  e[0]);.    if( r
21880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21890 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
218a0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
218b0 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
218c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
218d0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
218e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72  ..    /* If pCur
218f0 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
21900 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
21910 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
21920 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
21930 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20      ** expected 
21940 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
21950 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
21960 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
21970 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20  yInfo is.    ** 
21980 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
21990 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
219a0 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
219b0 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
219c0 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  ,.    ** return 
219d0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
219e0 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20  T error.  */.   
219f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21a00 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
21a10 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==1 || pCur->apP
21a20 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
21a30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43  0 );.    if( (pC
21a40 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
21a50 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  !=pCur->apPage[0
21a60 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
21a70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21a80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21a90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
21aa0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 72  ssert that the r
21ab0 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20 74  oot page is of t
21ac0 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e  he correct type.
21ad0 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74 68   This must be th
21ae0 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74  e.  ** case as t
21af0 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  he call to this 
21b00 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f  function that lo
21b10 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61  aded the root-pa
21b20 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a 20  ge (either.  ** 
21b30 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70  this call or a p
21b40 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69  revious invocati
21b50 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64  on) would have d
21b60 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
21b70 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  on .  ** if the 
21b80 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 20  assumption were 
21b90 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69 74  not true, and it
21ba0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
21bb0 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20 0a   for the flags .
21bc0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61 76    ** byte to hav
21bd0 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
21be0 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73 6f  while this curso
21bf0 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
21c00 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f  eference.  ** to
21c10 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20   the page.  */. 
21c20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
21c30 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
21c40 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
21c50 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
21c60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  );.  assert( pRo
21c70 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28 70  ot->isInit && (p
21c80 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
21c90 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )==pRoot->intKey
21ca0 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49   );..  pCur->aiI
21cb0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
21cc0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
21cd0 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73  0;.  pCur->atLas
21ce0 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  t = 0;.  pCur->v
21cf0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
21d00 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
21d10 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
21d20 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
21d30 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
21d40 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
21d50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21d60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21d70 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
21d80 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
21d90 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
21da0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
21db0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
21dc0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
21dd0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
21de0 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
21df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
21e00 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52  r->eState = ((pR
21e10 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55  oot->nCell>0)?CU
21e20 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f  RSOR_VALID:CURSO
21e30 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a  R_INVALID);.  }.
21e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21e50 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
21e60 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
21e70 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
21e80 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
21e90 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
21ea0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
21eb0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
21ec0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
21ed0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
21ee0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
21ef0 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
21f00 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
21f10 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
21f20 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
21f30 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
21f40 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
21f50 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
21f60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
21f70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
21f80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21f90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21fb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21fc0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
21fd0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
21fe0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
21ff0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22000 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
22010 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22020 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22030 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
22040 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
22050 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
22060 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
22070 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22080 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
22090 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
220a0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
220b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
220c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
220d0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
220e0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
220f0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
22100 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
22110 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
22120 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
22130 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
22140 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
22150 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
22160 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
22170 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
22180 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
22190 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
221a0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
221b0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
221c0 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
221d0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
221e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
221f0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
22200 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
22210 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
22220 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
22230 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
22240 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
22250 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
22260 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
22270 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
22280 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
22290 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
222a0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
222b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
222c0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
222d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
222e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
222f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
22300 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22310 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
22320 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
22330 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
22340 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22350 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
22360 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
22370 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
22380 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
22390 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
223a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
223b0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
223c0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
223d0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
223e0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
223f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22400 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
22410 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22420 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
22430 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ll-1;.    pCur->
22440 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
22450 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
22460 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
22470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
22480 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
22490 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
224a0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
224b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
224c0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
224d0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
224e0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
224f0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
22500 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
22510 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
22520 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
22530 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
22540 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
22550 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
22560 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
22570 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
22580 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22590 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
225a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
225b0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
225c0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
225d0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
225e0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
225f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22600 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
22610 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22620 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
22630 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22640 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22650 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
22660 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
22670 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   1;.      rc = S
22680 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
22690 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
226a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
226b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
226c0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
226d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
226e0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
226f0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
22700 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22710 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
22720 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
22730 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
22740 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
22750 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
22760 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
22770 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
22780 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
22790 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
227a0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
227b0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
227c0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
227d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
227e0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
227f0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
22800 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
22810 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
22820 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
22840 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22850 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
22860 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
22870 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
22880 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
22890 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
228a0 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
228b0 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
228c0 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
228d0 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d  >eState && pCur-
228e0 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65  >atLast ){.#ifde
228f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
22900 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
22910 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
22920 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
22930 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
22940 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
22950 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
22960 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
22970 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
22980 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
22990 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
229a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
229b0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
229c0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
229d0 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
229e0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
229f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22a00 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
22a10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22a20 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
22a30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22a40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22a50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
22a60 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
22a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
22a80 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
22a90 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
22aa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22ab0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
22ac0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
22ad0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
22ae0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22af0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22b00 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
22b10 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
22b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
22b30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
22b40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22b50 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
22b60 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
22b70 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
22b80 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43  (pCur);.      pC
22b90 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d  ur->atLast = rc=
22ba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b  =SQLITE_OK ?1:0;
22bb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22bc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
22bd0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
22be0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
22bf0 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
22c00 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
22c10 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
22c20 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
22c30 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
22c40 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
22c50 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
22c60 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
22c70 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
22c80 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
22c90 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
22ca0 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
22cb0 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
22cc0 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
22cd0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
22ce0 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
22cf0 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
22d00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
22d10 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
22d20 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
22d30 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
22d40 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
22d50 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
22d60 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
22d70 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
22d80 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
22d90 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
22da0 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
22db0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
22dc0 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
22dd0 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
22de0 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
22df0 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
22e00 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
22e10 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
22e20 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
22e30 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
22e40 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
22e50 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
22e60 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
22e70 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
22e80 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
22e90 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
22ea0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
22eb0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
22ee0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
22ef0 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
22f00 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
22f20 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
22f30 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
22f40 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
22f50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
22f60 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
22f70 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
22f80 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
22f90 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
22fa0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
22fb0 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
22fc0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
22fd0 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
22fe0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
22ff0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
23000 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
23030 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
23040 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
23050 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
23060 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
23070 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
23080 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
23090 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
230a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
230b0 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
230c0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
230d0 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230f0 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
23100 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
23110 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
23120 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
23130 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
23140 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
23150 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
23160 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
23170 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
23180 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
23190 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
231a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
231b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
231c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
231d0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
231e0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
231f0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
23200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
23210 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
23220 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
23230 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
23240 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
23250 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
23260 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
23270 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
23280 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
23290 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
232a0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
232b0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
232c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
232d0 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
232e0 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43  idNKey .   && pC
232f0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
23300 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
23310 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
23320 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
23330 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
23340 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23350 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
23360 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
23370 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
23380 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
23390 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
233a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
233b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
233c0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
233d0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
233e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
233f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
23400 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
23410 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23430 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23440 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
23450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23460 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23470 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
23480 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
23490 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
234a0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
234b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
234c0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
234d0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
234e0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
234f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23500 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
23510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23520 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23530 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
23540 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
23550 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
23560 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
23570 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  r;.    Pgno chld
23580 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
23590 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
235a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
235b0 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a  e];.    int c;..
235c0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
235d0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
235e0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
235f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
23600 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
23610 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
23620 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
23630 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
23640 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
23650 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
23660 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
23670 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
23680 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
23690 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
236a0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
236b0 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
236c0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
236d0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
236e0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
236f0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
23700 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
23710 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
23720 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
23730 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
23740 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
23750 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
23760 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
23770 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
23780 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
23790 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
237a0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
237b0 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
237c0 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
237d0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
237e0 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62  ell-1;.    if( b
237f0 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
23800 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
23810 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
23820 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  6)upr;.    }else
23830 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
23840 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23850 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77   = (u16)((upr+lw
23860 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
23870 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
23880 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
23890 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
238a0 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  e]; /* Index of 
238b0 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
238c0 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75  pPage */.      u
238d0 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
23900 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
23910 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20   pPage */..     
23920 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
23930 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65  e = 0;.      pCe
23940 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
23950 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
23960 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
23970 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
23980 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
23990 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
239a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
239b0 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
239c0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
239d0 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
239e0 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
239f0 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
23a00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23a10 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
23a20 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
23a30 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
23a40 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
23a50 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
23a60 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
23a70 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
23a80 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
23a90 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
23aa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23ab0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23ac0 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
23ad0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
23ae0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
23af0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61          pCur->va
23b00 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
23b10 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
23b20 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
23b30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23b40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
23b50 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
23b60 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36  age-size is 3276
23b70 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  8 bytes. This me
23b80 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
23b90 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
23ba0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
23bb0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
23bc0 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
23bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
23be0 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38   is at most 8198
23bf0 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61   bytes, which ma
23c00 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
23c10 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
23c20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
23c30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
23c40 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
23c50 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
23c60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
23c70 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
23c80 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
23c90 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
23ca0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
23cb0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
23cc0 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
23cd0 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
23ce0 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
23cf0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
23d00 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
23d10 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
23d20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
23d30 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
23d40 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65         if( !(nCe
23d50 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43  ll & 0x80) && nC
23d60 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ell<=pPage->maxL
23d70 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
23d80 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
23d90 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
23da0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
23db0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
23dc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
23dd0 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
23de0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
23df0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
23e00 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
23e10 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
23e20 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
23e30 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
23e40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
23e50 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
23e60 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
23e70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
23e80 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
23e90 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
23ea0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
23eb0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
23ec0 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
23ed0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
23ee0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23ef0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
23f00 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
23f10 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
23f20 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
23f30 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
23f40 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
23f50 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
23f60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
23f70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
23f80 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
23f90 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
23fa0 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
23fb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23fc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
23fd0 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
23fe0 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
23ff0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
24000 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
24010 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
24020 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
24030 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
24040 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
24050 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
24060 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
24070 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
24080 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
24090 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
240a0 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
240b0 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
240c0 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
240d0 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
240e0 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
240f0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
24100 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
24110 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
24120 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
24130 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
24140 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
24150 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
24160 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
24170 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
24180 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
24190 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
241a0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
241b0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
241c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
241d0 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
241e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
241f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
24200 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
24210 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
24220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24230 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
24240 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
24250 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
24260 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
24270 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
24280 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
24290 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
242a0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
242b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
242c0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
242d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
242e0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
242f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
24300 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
24310 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
24320 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24330 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
24340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24350 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
24360 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
24370 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
24380 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
24390 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
243a0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
243b0 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
243c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
243d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
243e0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
243f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
24410 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
24420 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
24430 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
24440 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
24450 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
24460 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24470 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
24480 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
24490 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
244a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
244b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
244c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
244d0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 6c  Page] = (u16)((l
244e0 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20  wr+upr)/2);.    
244f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
24500 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
24510 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
24520 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
24530 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
24540 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
24550 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
24560 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
24570 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
24580 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
24590 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
245a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
245b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
245c0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
245d0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
245e0 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
245f0 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
24600 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
24610 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
24620 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
24630 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24640 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
24650 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
24660 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
24670 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
24680 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
24690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
246a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
246b0 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
246c0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
246d0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
246e0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
246f0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
24700 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
24710 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
24720 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
24730 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76  _finish;.  }.mov
24740 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65  eto_finish:.  re
24750 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
24760 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
24770 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
24780 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
24790 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
247a0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
247b0 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
247c0 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
247d0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
247e0 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
247f0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
24800 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
24810 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
24820 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
24830 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
24840 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
24850 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
24860 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
24870 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
24880 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
24890 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
248a0 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
248b0 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
248c0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
248d0 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
248e0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
248f0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
24900 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
24910 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
24920 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
24930 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
24940 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
24950 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
24960 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
24970 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
24980 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
24990 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
249a0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
249b0 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
249c0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
249d0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
249e0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
249f0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
24a00 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
24a10 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
24a20 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
24a30 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
24a40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
24a50 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
24a60 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
24a70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
24a80 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
24a90 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
24aa0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
24ab0 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
24ac0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
24ad0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24ae0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
24af0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
24b00 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
24b10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
24b30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
24b40 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
24b50 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
24b60 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
24b70 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
24b80 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
24b90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
24ba0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
24bb0 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  xt>0 ){.    pCur
24bc0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
24bd0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
24be0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24bf0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
24c00 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a  >skipNext = 0;..
24c10 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
24c20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24c30 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
24c40 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24c50 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
24c60 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
24c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
24c80 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x<=pPage->nCell 
24c90 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
24ca0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
24cb0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
24cc0 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
24cd0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
24ce0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
24cf0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
24d00 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
24d10 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
24d20 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
24d30 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
24d40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
24d50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
24d60 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
24d70 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
24d80 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
24d90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24da0 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
24db0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
24dc0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
24dd0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
24de0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24df0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
24e00 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
24e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24e20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
24e30 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
24e40 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
24e50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24e60 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
24e70 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
24e80 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
24e90 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
24ea0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
24eb0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
24ec0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
24ed0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
24ee0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
24ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
24f00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24f10 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
24f20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
24f30 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
24f40 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
24f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24f60 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
24f70 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
24f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24f90 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
24fa0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
24fb0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
24fc0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
24fd0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
24fe0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
24ff0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
25000 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
25010 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
25020 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
25030 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
25040 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
25050 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
25060 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
25070 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
25080 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25090 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
250a0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
250b0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
250c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
250d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
250e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
250f0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
25100 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
25110 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
25120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25130 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
25140 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
25150 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
25160 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
25170 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
25180 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
25190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
251a0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
251b0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
251c0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
251d0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
251e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
251f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25200 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
25210 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
25220 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
25230 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
25240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
25250 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
25260 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
25270 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
25280 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25290 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
252a0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
252b0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
252c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
252d0 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
252e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
252f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
25300 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
25310 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
25320 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
25330 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25340 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
25350 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
25360 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
25370 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
25380 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
25390 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
253a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
253b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
253c0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
253d0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
253e0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
253f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
25400 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
25410 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
25420 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25430 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
25440 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
25450 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
25460 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
25470 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
25480 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
25490 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
254a0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
254b0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
254c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
254d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
254e0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
254f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25500 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
25510 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
25520 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
25530 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
25540 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
25550 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
25560 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
25570 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
25580 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
25590 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
255a0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
255b0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
255c0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
255d0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
255e0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
255f0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
25600 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
25610 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
25620 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
25630 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
25640 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
25650 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
25660 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
25670 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
25680 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
25690 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
256a0 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
256b0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
256c0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
256d0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
256e0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
256f0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
25700 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
25710 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
25720 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
25730 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
25740 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
25750 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
25760 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
25770 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
25780 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
25790 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
257a0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
257b0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
257c0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
257d0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
257e0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
257f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
25800 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
25810 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
25820 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
25830 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
25840 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
25850 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
25860 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
25870 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
25880 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
25890 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
258a0 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
258b0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
258c0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
258d0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
258e0 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
258f0 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
25900 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
25910 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
25920 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
25930 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
25940 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
25950 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
25960 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
25970 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
25980 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
25990 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
259a0 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
259b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
259c0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
259d0 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
259e0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
259f0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
25a00 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
25a10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
25a20 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
25a30 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
25a40 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
25a50 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
25a60 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
25a70 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
25a80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
25a90 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
25aa0 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
25ab0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
25ac0 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
25ad0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
25ae0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
25af0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
25b00 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
25b10 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
25b20 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
25b30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
25b40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25b50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
25b60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
25b70 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
25b80 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
25b90 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
25ba0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
25bb0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
25bc0 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
25bd0 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
25be0 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
25bf0 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
25c00 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
25c10 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
25c20 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
25c30 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
25c40 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
25c50 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
25c60 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
25c70 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
25c80 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
25c90 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
25ca0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
25cb0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
25cc0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
25cd0 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
25ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25cf0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
25d00 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
25d10 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
25d20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
25d30 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
25d40 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
25d50 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
25d60 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
25d70 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
25d80 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
25d90 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
25da0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25db0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
25dc0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
25dd0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
25de0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
25df0 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
25e00 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
25e10 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
25e20 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
25e30 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
25e40 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
25e50 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
25e60 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
25e70 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
25e80 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
25e90 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
25ea0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
25eb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25ec0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
25ed0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
25ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25ef0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
25f00 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
25f10 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
25f20 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
25f30 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
25f40 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
25f50 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
25f60 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
25f70 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
25f80 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
25f90 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
25fa0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
25fb0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
25fc0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
25fd0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
25fe0 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
25ff0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
26000 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
26010 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
26020 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
26030 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
26040 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
26050 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
26060 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
26070 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
26080 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
26090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
260a0 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
260b0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
260c0 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
260d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
260e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
260f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
26100 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
26110 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
26120 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
26130 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
26140 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
26150 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
26160 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
26170 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
26180 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
26190 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
261a0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
261b0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
261c0 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
261d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
261e0 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
261f0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
26200 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
26210 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
26220 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
26230 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
26240 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
26250 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
26260 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
26270 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
26280 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26290 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
262a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
262b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
262c0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
262d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
262e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
262f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26300 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
26310 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
26320 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
26330 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
26340 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
26350 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
26360 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
26370 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
26380 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
26390 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
263a0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
263b0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
263c0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
263d0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
263e0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
263f0 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
26400 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
26410 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
26420 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
26430 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
26440 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
26450 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26460 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26470 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
26480 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
26490 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
264a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
264b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
264c0 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
264d0 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
264e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
264f0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
26500 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
26510 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
26520 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
26530 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
26540 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
26550 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
26560 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26570 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
26580 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
26590 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
265a0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
265b0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
265c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
265d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
265e0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
265f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
26600 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
26610 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
26620 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
26630 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
26640 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
26650 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
26660 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
26670 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
26680 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
26690 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
266a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
266b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
266c0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
266d0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
266e0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
266f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26710 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
26720 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
26730 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
26740 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
26750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
26760 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
26770 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
26780 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
26790 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
267a0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
267b0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
267c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
267d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
267e0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
267f0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
26800 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
26810 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
26820 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
26830 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
26840 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
26850 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
26860 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
26870 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26880 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
268a0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
268b0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
268c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
268d0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
268e0 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
268f0 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
26900 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26920 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
26930 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
26940 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26950 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26960 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
26970 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
26980 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
269a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
269b0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
269c0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
269d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
269e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
269f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
26a00 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
26a10 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
26a20 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
26a30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
26a40 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
26a50 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
26a60 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26a70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
26a80 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
26a90 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
26aa0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
26ab0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
26ac0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
26ad0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
26ae0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
26af0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26b00 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
26b10 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
26b20 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
26b30 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
26b40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
26b50 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
26b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26b70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26b80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
26b90 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
26ba0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26bb0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26bc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
26bd0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
26be0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26bf0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
26c00 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
26c10 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
26c20 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
26c30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26c40 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
26c50 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
26c60 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
26c70 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
26c80 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
26c90 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
26ca0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
26cb0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
26cc0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
26cd0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
26ce0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
26cf0 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
26d00 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
26d10 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
26d20 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
26d30 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
26d40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26d50 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
26d60 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
26d70 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
26d80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
26d90 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
26da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26db0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
26dc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
26dd0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
26de0 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
26df0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
26e00 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
26e10 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
26e20 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  8]) - nearby;.  
26e30 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74          if( dist
26e40 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73  <0 ) dist = -dis
26e50 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  t;.          for
26e60 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
26e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
26e80 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26   d2 = get4byte(&
26e90 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
26ea0 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
26eb0 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64      if( d2<0 ) d
26ec0 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20  2 = -d2;.       
26ed0 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
26ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26ef0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
26f10 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
26f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26f30 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
26f40 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
26f50 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
26f60 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
26f70 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
26f80 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
26f90 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
26fa0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
26fb0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
26fc0 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
26fd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26fe0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
26ff0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
27000 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27010 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
27020 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
27030 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
27040 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
27050 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69  !searchList || i
27060 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a  Page==nearby ){.
27070 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
27080 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
27090 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
270a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
270b0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
270c0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
270d0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
270e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
270f0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
27100 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
27120 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
27130 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
27140 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
27150 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
27160 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
27170 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
27180 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
27190 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
271a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
271b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
271c0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
271d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
271e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
271f0 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b  writeable(pTrunk
27200 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
27210 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
27220 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
27230 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
27240 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
27250 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
27260 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
27270 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
27280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
27290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
272a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
272b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
272c0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
272d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
272e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
272f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27300 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
27310 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
27320 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27340 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
27350 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
27360 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
27370 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
27380 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
27390 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
273a0 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
273b0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
273c0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
273d0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
273e0 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74  eelist, so creat
273f0 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20  e a new page at 
27400 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  the.    ** end o
27410 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
27420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27430 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
27440 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
27450 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27460 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
27470 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
27480 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
27490 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
274a0 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
274b0 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
274c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
274d0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
274e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
274f0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
27500 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
27510 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
27520 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
27530 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
27540 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
27550 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
27560 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
27570 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
27580 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
27590 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
275a0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
275b0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
275c0 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
275d0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
275e0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
275f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
27600 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
27610 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
27620 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
27630 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
27640 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
27650 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
27660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
27670 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
27680 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
27690 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
276a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
276b0 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
276c0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 1);.      if(
276d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
276e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
276f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27700 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
27710 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
27720 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
27730 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
27740 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27750 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
27760 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
27770 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
27780 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
27790 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
277a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
277b0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
277c0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
277d0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
277e0 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
277f0 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
27800 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
27810 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
27820 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
27830 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
27840 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
27850 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20  ppPage, 1);.    
27860 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
27870 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
27880 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
27890 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
278a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
278b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
278c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
278d0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
278e0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
278f0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
27900 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
27910 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
27920 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
27930 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
27940 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
27950 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
27960 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
27970 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
27980 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
27990 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
279a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
279b0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
279c0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
279d0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
279e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
279f0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
27a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27a10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
27a20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
27a30 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
27a40 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
27a50 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
27a60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27a70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27a80 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
27a90 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
27aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
27ab0 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
27ac0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
27ad0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
27ae0 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
27af0 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
27b00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
27b10 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
27b20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
27b30 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
27b40 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
27b50 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
27b60 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
27b70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
27b80 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
27b90 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
27ba0 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
27bb0 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
27bc0 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
27bd0 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
27be0 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
27bf0 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
27c00 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
27c10 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
27c20 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
27c30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
27c40 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
27c50 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
27c60 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
27c70 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
27c80 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
27c90 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
27ca0 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
27cb0 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
27cc0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
27cd0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
27ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
27cf0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
27d00 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
27d10 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
27d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
27d30 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
27d40 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
27d50 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
27d60 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
27d70 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
27d80 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
27d90 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
27da0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
27dd0 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
27de0 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27e10 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
27e20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e40 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
27e50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
27e60 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
27e70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27e80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
27e90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
27ea0 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b  sert( iPage>1 );
27eb0 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
27ec0 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
27ed0 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
27ee0 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ..  if( pMemPage
27ef0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
27f00 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
27f10 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
27f20 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
27f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
27f40 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
27f50 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
27f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
27f70 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
27f80 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
27f90 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
27fa0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
27fb0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
27fc0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
27fd0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
27fe0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
27ff0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
28000 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
28010 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
28020 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
28030 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75  .  if( pBt->secu
28040 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
28050 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65  /* If the secure
28060 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69  _delete option i
28070 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
28080 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75      ** always fu
28090 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
280a0 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
280b0 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
280c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
280d0 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62  Page && ((rc = b
280e0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
280f0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
28100 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c  0))!=0) ).     |
28110 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72  |            ((r
28120 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28130 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
28140 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29  Page))!=0).    )
28150 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
28160 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
28170 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
28180 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
28190 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
281a0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
281b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
281c0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
281d0 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
281e0 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
281f0 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
28200 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
28210 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
28220 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
28230 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
28240 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
28250 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
28260 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
28270 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
28280 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
28290 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
282a0 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
282b0 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
282c0 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
282d0 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
282e0 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
282f0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
28300 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
28310 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
28320 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
28330 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
28340 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
28350 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
28360 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
28370 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
28380 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
28390 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
283a0 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
283b0 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
283c0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
283d0 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
283e0 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
283f0 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
28400 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
28410 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
28420 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
28430 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
28440 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
28450 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
28460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
28470 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
28480 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
28490 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
284a0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
284b0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
284c0 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
284d0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
284e0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
284f0 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
28500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28510 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
28520 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
28530 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
28540 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
28550 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
28560 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
28570 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
28580 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
28590 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
285a0 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
285b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
285c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
285d0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
285e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
285f0 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
28600 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
28610 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
28620 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
28630 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
28640 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
28650 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
28660 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
28670 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
28680 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
28690 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
286a0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
286b0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
286c0 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
286d0 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
286e0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
286f0 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
28700 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
28710 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
28720 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
28730 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
28740 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
28750 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
28760 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
28770 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
28780 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
28790 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
287a0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
287b0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
287c0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
287d0 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
287e0 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
287f0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
28800 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
28810 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
28820 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
28830 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
28840 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
28850 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
28860 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
28870 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
28880 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
28890 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
288a0 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
288b0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
288c0 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
288d0 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
288e0 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
288f0 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
28900 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
28910 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
28920 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
28930 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
28940 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
28950 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
28960 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
28970 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
28980 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28990 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
289a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
289b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
289c0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
289d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
289e0 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
289f0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
28a00 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
28a10 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
28a20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
28a30 26 26 20 21 70 42 74 2d 3e 73 65 63 75 72 65 44  && !pBt->secureD
28a40 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
28a50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
28a60 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
28a70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
28a80 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
28a90 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
28aa0 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
28ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
28ac0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
28ad0 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
28ae0 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
28af0 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
28b00 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
28b10 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
28b20 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
28b30 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
28b40 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
28b50 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
28b60 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
28b70 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
28b80 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
28b90 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
28ba0 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
28bb0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
28bc0 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
28bd0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
28be0 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
28bf0 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
28c00 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
28c10 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
28c20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
28c30 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
28c40 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
28c50 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
28c60 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
28c70 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
28c80 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
28c90 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
28ca0 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
28cb0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
28cc0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
28cd0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
28ce0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
28cf0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
28d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28d10 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
28d20 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
28d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28d40 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
28d50 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
28d60 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
28d70 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
28d80 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
28d90 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
28da0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
28db0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
28dc0 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
28dd0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
28de0 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
28df0 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
28e00 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
28e10 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
28e20 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
28e30 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
28e40 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
28e50 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
28e60 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
28e70 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
28e80 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
28e90 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
28ea0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
28eb0 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
28ec0 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
28ed0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
28ee0 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
28ef0 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
28f00 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
28f10 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
28f20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
28f30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
28f40 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
28f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
28f60 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
28f70 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
28f80 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
28f90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
28fa0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
28fb0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
28fc0 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
28fd0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
28fe0 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50  vfl;.  u16 ovflP
28ff0 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
29000 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29010 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
29020 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62  t->mutex) );.  b
29030 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
29040 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
29050 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
29060 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
29070 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29080 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
29090 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
290a0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
290b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
290c0 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
290d0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
290e0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
290f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
29100 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
29110 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
29120 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
29130 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
29140 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
29150 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
29160 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
29170 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
29180 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
29190 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
291a0 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
291b0 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
291c0 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
291d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
291e0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
291f0 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
29200 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
29210 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
29220 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
29230 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
29240 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
29250 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
29260 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
29270 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
29280 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
29290 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
292a0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
292b0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
292c0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
292d0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
292e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
292f0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
29300 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
29310 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
29320 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
29330 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
29340 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
29350 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
29370 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
29380 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
29390 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
293a0 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
293b0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
293c0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
293d0 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
293e0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
293f0 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
29400 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
29410 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
29420 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
29430 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
29440 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
29450 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
29460 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
29470 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
29480 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
29490 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
294a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
294b0 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
294c0 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
294d0 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
294e0 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
294f0 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
29500 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
29510 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
29520 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
29530 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
29540 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
29550 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
29560 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
29570 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
29580 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
29590 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
295a0 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
295b0 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
295c0 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
295d0 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
295e0 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
295f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
29600 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
29610 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
29620 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
29630 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
29640 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
29650 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
29660 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
29670 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29680 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29690 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
296a0 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
296b0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
296c0 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
296d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
296e0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
296f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
29700 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29710 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
29720 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
29730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29740 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
29750 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
29760 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
29770 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
29780 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
29790 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
297a0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
297b0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
297c0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
297d0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
297e0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
297f0 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
29800 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
29810 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
29820 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
29830 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
29840 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
29850 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
29860 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
29870 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
29880 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
29890 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
298a0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
298b0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
298c0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
298d0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
298e0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
298f0 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
29900 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
29910 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
29920 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
29930 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
29940 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
29950 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
29960 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
29970 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
29980 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
29990 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
299a0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
299b0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
299c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
299d0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
299e0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
299f0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
29a00 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
29a10 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
29a20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
29a30 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
29a40 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
29a50 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
29a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
29a70 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
29a80 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
29a90 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
29aa0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
29ab0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
29ac0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
29ad0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
29ae0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
29af0 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
29b00 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
29b10 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
29b20 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
29b30 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
29b40 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
29b50 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
29b60 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
29b70 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
29b80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
29b90 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
29ba0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
29bb0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
29bc0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
29bd0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
29be0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29bf0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
29c00 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
29c10 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
29c20 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
29c30 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
29c40 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
29c50 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
29c60 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
29c70 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
29c80 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
29c90 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
29ca0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
29cb0 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
29cc0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
29cd0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
29ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29cf0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29d00 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
29d10 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
29d20 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
29d30 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
29d40 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
29d50 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
29d60 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
29d70 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
29d80 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
29d90 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
29da0 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
29db0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
29dc0 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
29dd0 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
29de0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
29df0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
29e00 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
29e10 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
29e20 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
29e30 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
29e40 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
29e50 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
29e60 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
29e70 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
29e80 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28  t( info.nData==(
29e90 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f  u32)(nData+nZero
29ea0 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ) );.  .  /* Fil
29eb0 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
29ec0 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
29ed0 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
29ee0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
29ef0 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
29f00 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
29f10 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
29f20 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
29f30 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e{ .    if( NEVE
29f40 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  R(nKey>0x7ffffff
29f50 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b  f || pKey==0) ){
29f60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
29f70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29f80 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  T;.    }.    nPa
29f90 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b  yload += (int)nK
29fa0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
29fb0 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
29fc0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
29fd0 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
29fe0 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65  nSize;.  spaceLe
29ff0 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ft = info.nLocal
2a000 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  ;.  pPayload = &
2a010 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
2a020 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
2a030 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
2a040 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61  ];..  while( nPa
2a050 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
2a060 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
2a070 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2a080 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2a090 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
2a0a0 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
2a0b0 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
2a0c0 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
2a0d0 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
2a0e0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
2a0f0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2a100 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
2a110 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
2a120 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
2a130 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
2a140 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
2a150 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
2a160 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
2a170 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
2a180 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
2a190 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
2a1a0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2a1b0 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
2a1c0 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
2a1d0 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
2a1e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2a1f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
2a200 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2a210 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2a220 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
2a230 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
2a240 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
2a250 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
2a260 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
2a270 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
2a280 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2a290 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
2a2a0 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
2a2b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
2a2c0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2a2d0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
2a2e0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
2a2f0 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
2a300 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
2a310 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
2a320 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
2a330 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
2a340 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
2a350 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
2a360 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
2a370 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
2a380 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
2a390 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
2a3a0 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
2a3b0 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65  nitialised value
2a3c0 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
2a3d0 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
2a3e0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
2a3f0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
2a400 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
2a410 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
2a420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a430 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
2a440 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
2a450 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
2a460 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
2a470 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2a480 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
2a490 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
2a4a0 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
2a4b0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2a4c0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2a4d0 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
2a4e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2a4f0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
2a500 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
2a510 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2a520 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
2a530 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a540 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
2a550 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2a560 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
2a570 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
2a580 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2a590 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2a5a0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2a5b0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2a5c0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2a5d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a5e0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2a5f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a600 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2a610 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2a620 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
2a630 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
2a640 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2a650 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2a660 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2a670 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
2a680 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
2a690 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
2a6a0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2a6b0 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
2a6c0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2a6d0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2a6e0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2a6f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2a700 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2a710 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2a720 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
2a730 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2a740 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2a750 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
2a760 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
2a770 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
2a780 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
2a790 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
2a7a0 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
2a7b0 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
2a7c0 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
2a7d0 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
2a7e0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
2a7f0 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
2a800 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
2a810 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
2a820 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
2a830 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
2a840 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
2a850 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
2a860 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2a870 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
2a880 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
2a890 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
2a8a0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2a8b0 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
2a8c0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
2a8d0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2a8e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
2a8f0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
2a900 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
2a910 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
2a920 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
2a930 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
2a940 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
2a950 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2a960 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
2a970 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
2a980 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
2a990 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
2a9a0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
2a9b0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
2a9c0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
2a9d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a9e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2a9f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
2aa00 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
2aa10 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
2aa20 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
2aa30 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
2aa40 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
2aa50 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
2aa60 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
2aa70 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
2aa80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
2aa90 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
2aaa0 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
2aab0 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
2aac0 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
2aad0 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
2aae0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
2aaf0 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
2ab00 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
2ab10 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2ab20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
2ab30 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2ab40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2ab50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
2ab60 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
2ab70 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
2ab80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
2ab90 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
2aba0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
2abb0 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
2abc0 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
2abd0 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
2abe0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
2abf0 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
2ac00 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
2ac10 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
2ac20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
2ac30 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
2ac40 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
2ac50 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
2ac60 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
2ac70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2ac80 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
2ac90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2aca0 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
2acb0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
2acc0 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
2acd0 70 52 43 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  pRC){.  int i;  
2ace0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2acf0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
2ad00 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
2ad10 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
2ad20 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
2ad30 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
2ad40 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2ad50 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
2ad60 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
2ad70 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
2ad80 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
2ad90 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
2ada0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
2adb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2adc0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2add0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
2ade0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
2adf0 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
2ae00 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
2ae10 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
2ae20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
2ae30 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
2ae40 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
2ae50 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2ae60 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
2ae70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
2ae80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2ae90 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2aea0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2aeb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2aec0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2aed0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2aee0 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
2aef0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
2af00 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
2af10 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
2af20 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
2af30 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
2af40 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2af50 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
2af60 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
2af70 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
2af80 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
2af90 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
2afa0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2afb0 69 66 28 20 70 63 20 3c 20 67 65 74 32 62 79 74  if( pc < get2byt
2afc0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2afd0 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
2afe0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2aff0 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
2b000 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b010 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
2b020 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
2b030 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
2b040 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
2b050 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
2b060 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2b070 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20  .  for(i=idx+1; 
2b080 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
2b090 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20  i++, ptr+=2){.  
2b0a0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32    ptr[0] = ptr[2
2b0b0 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  ];.    ptr[1] = 
2b0c0 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50  ptr[3];.  }.  pP
2b0d0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
2b0e0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2b0f0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
2b100 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
2b110 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a  Free += 2;.}../*
2b120 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
2b130 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
2b140 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
2b150 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
2b160 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
2b170 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
2b180 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
2b190 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
2b1a0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
2b1b0 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
2b1c0 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
2b1d0 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
2b1e0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
2b1f0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2b200 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
2b210 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
2b220 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
2b230 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
2b240 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
2b250 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   in pPage->aOvfl
2b260 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
2b270 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
2b280 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
2b290 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
2b2a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
2b2b0 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
2b2c0 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
2b2d0 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
2b2e0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
2b2f0 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
2b300 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
2b310 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
2b320 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
2b330 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20  .** If nSkip is 
2b340 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64  non-zero, then d
2b350 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66  o not copy the f
2b360 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73  irst nSkip bytes
2b370 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e   of the.** cell.
2b380 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2b390 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20   overwrite them 
2b3a0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
2b3b0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a  ion returns. If.
2b3c0 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  ** nSkip is non-
2b3d0 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c  zero, then pCell
2b3e0 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74   may not point t
2b3f0 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d  o an invalid mem
2b400 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a  ory location .**
2b410 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69   (but pCell+nSki
2b420 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  p is always vali
2b430 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  d)..*/.static vo
2b440 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  id insertCell(. 
2b450 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2b460 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
2b470 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
2b480 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
2b490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b4a0 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
2b4b0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
2b4c0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
2b4d0 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
2b4e0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
2b4f0 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
2b500 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
2b510 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
2b520 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
2b530 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
2b540 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
2b550 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
2b560 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
2b570 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  d */.  Pgno iChi
2b580 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  ld,      /* If n
2b590 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65  on-zero, replace
2b5a0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77   first 4 bytes w
2b5b0 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a  ith this value *
2b5c0 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20  /.  int *pRC    
2b5d0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e        /* Read an
2b5e0 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63  d write return c
2b5f0 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f  ode from here */
2b600 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20  .){.  int idx = 
2b610 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  0;      /* Where
2b620 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
2b630 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
2b640 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
2b650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2b660 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2b670 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20   int end;       
2b680 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
2b690 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63   past the last c
2b6a0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
2b6b0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ata[] */.  int i
2b6c0 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ns;          /* 
2b6d0 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20  Index in data[] 
2b6e0 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70  where new cell p
2b6f0 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74  ointer is insert
2b700 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ed */.  int cell
2b710 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64  Offset;   /* Add
2b720 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65  ress of first ce
2b730 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
2b740 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ta[] */.  u8 *da
2b750 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
2b760 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2b770 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
2b780 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
2b790 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20      /* Used for 
2b7a0 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  moving informati
2b7b0 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74  on around in dat
2b7c0 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53  a[] */..  int nS
2b7d0 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20  kip = (iChild ? 
2b7e0 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a  4 : 0);..  if( *
2b7f0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2b800 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
2b810 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
2b820 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
2b830 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
2b840 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
2b850 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2b860 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2b870 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
2b880 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b890 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
2b8a0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f  aySize(pPage->aO
2b8b0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2b8c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b8d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2b8e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
2b8f0 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
2b900 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
2b910 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
2b920 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
2b930 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
2b940 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
2b950 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
2b960 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
2b970 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
2b980 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
2b990 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
2b9a0 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
2b9b0 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
2b9c0 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
2b9d0 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
2b9e0 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
2b9f0 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
2ba00 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
2ba10 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
2ba20 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
2ba30 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
2ba40 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
2ba50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
2ba60 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
2ba70 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
2ba80 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
2ba90 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
2baa0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
2bab0 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
2bac0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
2bad0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
2bae0 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
2baf0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
2bb00 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
2bb10 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
2bb20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
2bb30 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2bb40 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
2bb50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
2bb60 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2bb70 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
2bb80 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
2bb90 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
2bba0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
2bbb0 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
2bbc0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
2bbd0 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
2bbe0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
2bbf0 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20  .idx = (u16)i;. 
2bc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
2bc10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2bc20 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2bc30 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2bc40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bc50 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
2bc60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2bc70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2bc80 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2bc90 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2bca0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2bcb0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2bcc0 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
2bcd0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
2bce0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
2bcf0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
2bd00 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
2bd10 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
2bd20 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
2bd30 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
2bd40 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
2bd50 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
2bd60 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
2bd70 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
2bd80 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
2bd90 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
2bda0 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
2bdb0 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74  wing two propert
2bdc0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
2bdd0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
2bde0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2bdf0 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a  idx >= end+2 );.
2be00 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
2be10 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  sz <= pPage->pBt
2be20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2be30 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
2be40 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
2be50 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
2be60 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
2be70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
2be80 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
2be90 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
2bea0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2beb0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
2bec0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
2bed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
2bee0 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64 61 74 61  j=end, ptr=&data
2bef0 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32  [j]; j>ins; j-=2
2bf00 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20  , ptr-=2){.     
2bf10 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32   ptr[0] = ptr[-2
2bf20 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20  ];.      ptr[1] 
2bf30 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d  = ptr[-1];.    }
2bf40 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2bf50 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
2bf60 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2bf70 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2bf80 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
2bf90 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
2bfa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2bfb0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2bfc0 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
2bfd0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
2bfe0 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
2bff0 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
2c000 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2c010 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
2c020 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
2c030 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2c040 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
2c050 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
2c060 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c070 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2c080 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
2c090 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
2c0a0 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
2c0b0 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
2c0c0 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
2c0d0 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
2c0e0 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
2c0f0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
2c100 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2c110 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
2c120 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2c130 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
2c140 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2c150 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
2c160 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
2c170 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
2c180 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2c190 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
2c1a0 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
2c1b0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2c1c0 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
2c1d0 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
2c1e0 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
2c1f0 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
2c200 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
2c210 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
2c220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2c230 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2c240 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
2c250 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2c260 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
2c270 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
2c280 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
2c290 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2c2a0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
2c2b0 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
2c2c0 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
2c2d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2c2e0 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
2c2f0 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2c300 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
2c310 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
2c320 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2c330 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
2c340 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2c350 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
2c360 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2c370 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2c380 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2c390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c3a0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2c3b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c3c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2c3d0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2c3e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2c3f0 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2c400 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2c410 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
2c420 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
2c430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2c440 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c450 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2c460 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
2c470 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2c480 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
2c490 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
2c4a0 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
2c4b0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2c4c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c4d0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2c4e0 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
2c4f0 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
2c500 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
2c510 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
2c520 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2c530 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2c540 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2c550 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c  ; i--){.    pCel
2c560 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63  lptr -= 2;.    c
2c570 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65  ellbody -= aSize
2c580 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74  [i];.    put2byt
2c590 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c  e(pCellptr, cell
2c5a0 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70  body);.    memcp
2c5b0 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
2c5c0 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53  ], apCell[i], aS
2c5d0 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  ize[i]);.  }.  p
2c5e0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2c5f0 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
2c600 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2c610 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  dr+5], cellbody)
2c620 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2c630 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e   -= (nCell*2 + n
2c640 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64  Usable - cellbod
2c650 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  y);.  pPage->nCe
2c660 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b  ll = (u16)nCell;
2c670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2c680 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
2c690 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
2c6a0 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
2c6b0 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
2c6c0 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
2c6d0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2c6e0 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
2c6f0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2c700 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
2c710 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2c720 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2c730 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
2c740 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
2c750 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
2c760 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
2c770 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
2c780 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
2c790 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
2c7a0 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
2c7b0 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
2c7c0 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
2c7d0 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
2c7e0 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
2c7f0 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
2c800 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
2c810 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
2c820 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
2c830 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
2c840 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
2c850 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
2c860 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
2c870 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
2c880 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
2c890 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
2c8a0 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
2c8b0 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
2c8c0 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
2c8d0 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
2c8e0 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
2c8f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
2c900 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2c910 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
2c920 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
2c930 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
2c940 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
2c950 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
2c960 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
2c970 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2c980 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
2c990 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
2c9a0 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
2c9b0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
2c9c0 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
2c9d0 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
2c9e0 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
2c9f0 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
2ca00 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
2ca10 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
2ca20 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
2ca30 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
2ca40 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
2ca50 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
2ca60 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
2ca70 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
2ca80 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68  ng to balance th
2ca90 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
2caa0 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
2cab0 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
2cac0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
2cad0 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
2cae0 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
2caf0 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
2cb00 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
2cb10 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
2cb20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
2cb30 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
2cb40 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
2cb50 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
2cb60 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
2cb70 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
2cb80 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
2cb90 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
2cba0 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
2cbb0 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
2cbc0 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
2cbd0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
2cbe0 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
2cbf0 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
2cc00 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
2cc10 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
2cc20 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
2cc30 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
2cc40 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
2cc50 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
2cc60 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
2cc70 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
2cc80 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
2cc90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61  ..**.** The pSpa
2cca0 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65  ce buffer is use
2ccb0 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d  d to store a tem
2ccc0 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74  porary copy of t
2ccd0 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65  he divider.** ce
2cce0 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
2ccf0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50  inserted into pP
2cd00 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65  arent. Such a ce
2cd10 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
2cd20 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20   4.** byte page 
2cd30 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20  number followed 
2cd40 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  by a variable le
2cd50 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e  ngth integer. In
2cd60 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
2cd70 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65   at most 13 byte
2cd80 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70  s. Hence the pSp
2cd90 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  ace buffer must 
2cda0 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31  be at.** least 1
2cdb0 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  3 bytes in size.
2cdc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2cdd0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
2cde0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d  Page *pParent, M
2cdf0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
2ce00 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74  8 *pSpace){.  Bt
2ce10 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42  Shared *const pB
2ce20 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20  t = pPage->pBt; 
2ce30 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74     /* B-Tree Dat
2ce40 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  abase */.  MemPa
2ce50 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  ge *pNew;       
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
2ce80 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ed page */.  int
2ce90 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ceb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2cec0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   */.  Pgno pgnoN
2ced0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2cee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2cef0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65  ge number of pNe
2cf00 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  w */..  assert( 
2cf10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2cf20 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2cf30 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2cf40 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2cf50 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2cf60 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2cf70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cf80 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
2cf90 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ..  if( pPage->n
2cfa0 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e  Cell<=0 ) return
2cfb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2cfc0 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  BKPT;..  /* Allo
2cfd0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
2cfe0 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   This page will 
2cff0 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74  become the right
2d000 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a  -sibling of .  *
2d010 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68  * pPage. Make th
2d020 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72  e parent page wr
2d030 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20  itable, so that 
2d040 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
2d050 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65  cell.  ** may be
2d060 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f   inserted. If bo
2d070 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  th these operati
2d080 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66  ons are successf
2d090 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a  ul, proceed..  *
2d0a0 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
2d0b0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2d0c0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
2d0d0 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72   0, 0);..  if( r
2d0e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d0f0 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20  .    u8 *pOut = 
2d100 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20  &pSpace[4];.    
2d110 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  u8 *pCell = pPag
2d120 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
2d130 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  l;.    u16 szCel
2d140 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
2d150 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2d160 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
2d170 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2d180 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d190 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
2d1a0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2d1b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2d1c0 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
2d1d0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
2d1e0 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
2d1f0 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
2d200 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
2d210 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
2d220 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
2d230 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
2d240 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f  &szCell);..    /
2d250 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2d260 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2d270 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2d280 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20   pointer map.   
2d290 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
2d2a0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
2d2b0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
2d2c0 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  er from the .   
2d2d0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
2d2e0 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
2d2f0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74  low page. If eit
2d300 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20  her of these.   
2d310 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66   ** operations f
2d320 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e  ails, the return
2d330 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75   code is set, bu
2d340 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  t the contents. 
2d350 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72     ** of the par
2d360 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69  ent page are sti
2d370 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62  ll manipulated b
2d380 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77  y thh code below
2d390 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73  ..    ** That is
2d3a0 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69   Ok, at this poi
2d3b0 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nt the parent pa
2d3c0 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ge is guaranteed
2d3d0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61   to.    ** be ma
2d3e0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52  rked as dirty. R
2d3f0 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
2d400 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73  r code will caus
2d410 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  e a.    ** rollb
2d420 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79  ack, undoing any
2d430 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f   changes made to
2d440 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2d450 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d460 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2d470 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
2d480 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
2d490 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2d4a0 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
2d4b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65  ;.      if( szCe
2d4c0 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  ll>pNew->minLoca
2d4d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  l ){.        ptr
2d4e0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
2d4f0 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ew, pCell, &rc);
2d500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d510 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2d520 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
2d530 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
2d540 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
2d550 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
2d560 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
2d570 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2d580 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
2d590 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
2d5a0 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
2d5b0 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
2d5c0 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
2d5d0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
2d5e0 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
2d5f0 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
2d600 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
2d610 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
2d620 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
2d630 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
2d640 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
2d650 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
2d660 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
2d670 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
2d680 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
2d690 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
2d6a0 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
2d6b0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2d6c0 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
2d6d0 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
2d6e0 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
2d6f0 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
2d700 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2d710 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
2d720 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
2d730 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
2d740 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
2d750 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
2d760 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
2d770 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
2d780 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
2d790 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
2d7a0 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
2d7b0 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
2d7c0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2d7d0 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
2d7e0 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
2d7f0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2d800 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
2d810 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
2d820 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2d830 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2d840 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
2d850 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2d860 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
2d870 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2d880 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
2d890 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
2d8a0 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2d8b0 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
2d8c0 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
2d8d0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
2d8e0 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
2d8f0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
2d900 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ent, pParent->nC
2d910 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e  ell, pSpace, (in
2d920 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c  t)(pOut-pSpace),
2d930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d940 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  0, pPage->pgno, 
2d950 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  &rc);..    /* Se
2d960 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
2d970 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
2d980 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
2d990 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
2d9a0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
2d9b0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2d9c0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2d9d0 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
2d9e0 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
2d9f0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
2da00 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
2da10 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50   */.    releaseP
2da20 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  age(pNew);.  }..
2da30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2da40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2da50 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2da60 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  E */..#if 0./*.*
2da70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2da80 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
2da90 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ute anything to 
2daa0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
2dab0 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69   SQLite..** it i
2dac0 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69  s sometimes acti
2dad0 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c  vated temporaril
2dae0 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e  y while debuggin
2daf0 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62  g code responsib
2db00 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69  le .** for setti
2db10 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ng pointer-map e
2db20 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
2db30 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63  c int ptrmapChec
2db40 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  kPages(MemPage *
2db50 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61  *apPage, int nPa
2db60 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ge){.  int i, j;
2db70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
2db80 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  age; i++){.    P
2db90 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b  gno n;.    u8 e;
2dba0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2dbb0 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b  age = apPage[i];
2dbc0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
2dbd0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2dbe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2dbf0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
2dc00 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
2dc10 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29  age->nCell; j++)
2dc20 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  {.      CellInfo
2dc30 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20   info;.      u8 
2dc40 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  *z;.     .      
2dc50 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  z = findCell(pPa
2dc60 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74  ge, j);.      bt
2dc70 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2dc80 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29  pPage, z, &info)
2dc90 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
2dca0 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
2dcb0 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
2dcc0 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e  = get4byte(&z[in
2dcd0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2dce0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
2dcf0 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c  t(pBt, ovfl, &e,
2dd00 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2dd10 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2dd20 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2dd30 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20  P_OVERFLOW1 );. 
2dd40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2dd50 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2dd60 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68  .        Pgno ch
2dd70 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a  ild = get4byte(z
2dd80 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2dd90 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2dda0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2ddb0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2ddc0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2ddd0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
2dde0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2ddf0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2de00 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
2de10 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2de20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2de30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2de40 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  8]);.      ptrma
2de50 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2de60 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2de70 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2de80 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2de90 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
2dea0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2deb0 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
2dec0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2ded0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79   is used to copy
2dee0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2def0 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
2df00 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70   stored .** on p
2df10 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
2df20 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70  e pTo. If page p
2df30 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c  From was not a l
2df40 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a  eaf page, then.*
2df50 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
2df60 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  p entries for ea
2df70 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72  ch child page ar
2df80 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  e updated so tha
2df90 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20  t the.** parent 
2dfa0 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74  page stored in t
2dfb0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
2dfc0 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  s page pTo. If p
2dfd0 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  From contained.*
2dfe0 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68  * any cells with
2dff0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
2e000 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68  ointers, then th
2e010 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2e020 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
2e030 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20  ntries are also 
2e040 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
2e050 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2e060 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a  is page pTo..**.
2e070 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63  ** If pFrom is c
2e080 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e  urrently carryin
2e090 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  g any overflow c
2e0a0 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e  ells (entries in
2e0b0 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   the.** MemPage.
2e0c0 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20  aOvfl[] array), 
2e0d0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70  they are not cop
2e0e0 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a  ied to pTo. .**.
2e0f0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
2e100 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73  ing, page pTo is
2e110 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75   reinitialized u
2e120 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61  sing btreeInitPa
2e130 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ge()..**.** The 
2e140 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74  performance of t
2e150 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2e160 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74  not critical. It
2e170 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
2e180 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65   .** the balance
2e190 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64  _shallower() and
2e1a0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
2e1b0 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65  ) procedures, ne
2e1c0 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63  ither of.** whic
2e1d0 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74  h are called oft
2e1e0 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20  en under normal 
2e1f0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a  circumstances..*
2e200 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
2e210 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65  pyNodeContent(Me
2e220 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65  mPage *pFrom, Me
2e230 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20  mPage *pTo, int 
2e240 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
2e250 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
2e260 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
2e270 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72   const pBt = pFr
2e280 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20  om->pBt;.    u8 
2e290 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20  * const aFrom = 
2e2a0 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20  pFrom->aData;.  
2e2b0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f    u8 * const aTo
2e2c0 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20   = pTo->aData;. 
2e2d0 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72     int const iFr
2e2e0 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68  omHdr = pFrom->h
2e2f0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e  drOffset;.    in
2e300 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d  t const iToHdr =
2e310 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29   ((pTo->pgno==1)
2e320 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20   ? 100 : 0);.   
2e330 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
2e340 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20   iData;.  .  .  
2e350 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2e360 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61  >isInit );.    a
2e370 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46  ssert( pFrom->nF
2e380 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20  ree>=iToHdr );. 
2e390 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
2e3a0 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2e3b0 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73  Hdr+5])<=pBt->us
2e3c0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
2e3d0 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
2e3e0 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
2e3f0 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
2e400 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2e410 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
2e420 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2e430 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
2e440 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
2e450 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
2e460 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
2e470 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
2e480 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
2e490 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
2e4a0 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
2e4b0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
2e4c0 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
2e4d0 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
2e4e0 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
2e4f0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
2e500 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
2e510 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
2e520 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
2e530 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
2e540 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
2e550 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
2e560 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
2e570 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
2e580 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
2e590 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
2e5a0 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
2e5b0 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
2e5c0 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
2e5d0 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
2e5e0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
2e5f0 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
2e600 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2e610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e620 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
2e630 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2e640 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
2e650 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2e660 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2e670 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2e680 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
2e690 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
2e6a0 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
2e6b0 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
2e6c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
2e6d0 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
2e6e0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
2e6f0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2e700 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
2e710 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
2e720 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2e730 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
2e740 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
2e750 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
2e760 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
2e770 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
2e780 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
2e790 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
2e7a0 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
2e7b0 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
2e7c0 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
2e7d0 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
2e7e0 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
2e7f0 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
2e800 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2e810 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
2e820 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
2e830 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
2e840 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
2e850 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
2e860 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
2e870 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
2e880 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
2e890 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
2e8a0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
2e8b0 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
2e8c0 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
2e8d0 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
2e8e0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2e8f0 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
2e900 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
2e910 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
2e920 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
2e930 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
2e940 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2e950 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
2e960 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
2e970 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
2e980 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
2e990 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
2e9a0 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
2e9b0 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
2e9c0 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
2e9d0 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
2e9e0 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
2e9f0 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
2ea00 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
2ea10 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2ea20 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
2ea30 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
2ea40 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
2ea50 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
2ea60 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
2ea70 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
2ea80 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
2ea90 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
2eaa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
2eab0 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
2eac0 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
2ead0 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
2eae0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
2eaf0 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
2eb00 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
2eb10 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2eb20 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
2eb30 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
2eb40 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2eb50 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
2eb60 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
2eb70 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
2eb80 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2eb90 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
2eba0 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
2ebb0 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
2ebc0 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
2ebd0 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
2ebe0 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
2ebf0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
2ec00 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2ec10 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
2ec20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
2ec30 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
2ec40 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
2ec50 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
2ec60 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
2ec70 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
2ec80 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
2ec90 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
2eca0 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
2ecb0 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
2ecc0 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
2ecd0 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
2ece0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2ecf0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
2ed00 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
2ed10 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
2ed20 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
2ed30 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2ed40 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
2ed50 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
2ed60 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
2ed70 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
2ed80 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
2ed90 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
2eda0 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
2edb0 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
2edc0 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
2edd0 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
2ede0 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
2edf0 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
2ee00 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
2ee10 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
2ee20 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
2ee30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2ee40 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
2ee50 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
2ee60 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
2ee70 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
2ee80 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
2ee90 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
2eea0 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
2eeb0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
2eec0 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
2eed0 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
2eee0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
2eef0 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
2ef00 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
2ef10 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
2ef20 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
2ef30 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
2ef40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
2ef50 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
2ef60 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
2ef70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2ef80 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
2ef90 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
2efa0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
2efb0 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65  nroot(.  MemPage
2efc0 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
2efd0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
2efe0 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69  nt page of sibli
2eff0 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ngs being balanc
2f000 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ed */.  int iPar
2f010 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20  entIdx,         
2f020 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2f030 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69   of "the page" i
2f040 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75  n pParent */.  u
2f050 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20  8 *aOvflSpace,  
2f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f070 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  * page-size byte
2f080 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70  s of space for p
2f090 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20  arent ovfl */.  
2f0a0 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20 20  int isRoot      
2f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0c0 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
2f0d0 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67  nt is a root-pag
2f0e0 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  e */.){.  BtShar
2f0f0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2f100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
2f110 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
2f120 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
2f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f140 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
2f150 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
2f160 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
2f170 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f180 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
2f190 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
2f1a0 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
2f1b0 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
2f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f1d0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2f1e0 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
2f1f0 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f210 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2f220 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
2f230 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
2f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f250 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2f260 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
2f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f280 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
2f290 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
2f2a0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
2f2b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f2c0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  K;          /* T
2f2d0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2f2e0 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72  /.  u16 leafCorr
2f2f0 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
2f300 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
2f310 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
2f320 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
2f330 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
2f340 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f350 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2f360 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
2f370 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
2f380 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
2f390 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
2f3a0 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
2f3b0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
2f3c0 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2f3e0 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
2f3f0 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
2f400 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
2f410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
2f420 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
2f430 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
2f440 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
2f450 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ace1 = 0;       
2f460 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
2f470 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
2f480 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pace1[] */.  int
2f490 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b   iOvflSpace = 0;
2f4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2f4b0 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
2f4c0 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a  f aOvflSpace[] *
2f4d0 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63  /.  int szScratc
2f4e0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2f4f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61   /* Size of scra
2f500 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65  tch memory reque
2f510 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  sted */.  MemPag
2f520 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
2f530 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2f540 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
2f550 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50  blings */.  MemP
2f560 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
2f570 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
2f580 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
2f590 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
2f5a0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
2f5b0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
2f5c0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2f5d0 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
2f5e0 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
2f5f0 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20    u8 *pRight;   
2f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f610 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61  * Location in pa
2f620 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69  rent of right-si
2f630 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f  bling pointer */
2f640 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d  .  u8 *apDiv[NB-
2f650 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
2f660 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
2f670 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2f680 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
2f690 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
2f6a0 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
2f6b0 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
2f6c0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
2f6d0 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
2f6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2f6f0 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
2f700 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
2f710 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
2f720 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
2f730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2f740 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
2f750 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2f760 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2f770 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2f780 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2f790 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2f7a0 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31  */.  u8 *aSpace1
2f7b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f7c0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
2f7d0 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
2f7e0 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e  s cells */.  Pgn
2f7f0 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
2f800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2f810 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61  p var to store a
2f820 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2f830 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72  */..  pBt = pPar
2f840 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  ent->pBt;.  asse
2f850 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2f860 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2f870 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2f880 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2f890 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2f8a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69  >pDbPage) );..#i
2f8b0 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41  f 0.  TRACE(("BA
2f8c0 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
2f8d0 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
2f8e0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2f8f0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
2f900 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
2f910 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50  At this point pP
2f920 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61  arent may have a
2f930 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66  t most one overf
2f940 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66  low cell. And if
2f950 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66  .  ** this overf
2f960 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73  low cell is pres
2f970 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ent, it must be 
2f980 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20  the cell with . 
2f990 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e   ** index iParen
2f9a0 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61  tIdx. This scena
2f9b0 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  rio comes about 
2f9c0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2f9d0 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  on.  ** is calle
2f9e0 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66  d (indirectly) f
2f9f0 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
2fa00 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20  Delete()..  */. 
2fa10 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
2fa20 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
2fa30 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  | pParent->nOver
2fa40 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73  flow==1 );.  ass
2fa50 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
2fa60 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
2fa70 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
2fa80 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78 20  idx==iParentIdx 
2fa90 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c  );..  if( !aOvfl
2faa0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74  Space ){.    ret
2fab0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2fac0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
2fad0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
2fae0 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41  es to balance. A
2faf0 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63  lso locate the c
2fb00 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
2fb10 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64  .  ** that divid
2fb20 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20  e the siblings. 
2fb30 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
2fb40 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69  de to find NN si
2fb50 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20  blings on .  ** 
2fb60 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2fb70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69  Page. More sibli
2fb80 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ngs are taken fr
2fb90 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77  om one side, how
2fba0 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74  ever, .  ** if t
2fbb0 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
2fbc0 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
2fbd0 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
2fbe0 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  e. If pParent.  
2fbf0 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
2fc00 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
2fc10 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
2fc20 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
2fc30 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  en.  .  **.  ** 
2fc40 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64  This loop also d
2fc50 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72  rops the divider
2fc60 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20   cells from the 
2fc70 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69  parent page. Thi
2fc80 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20  s.  ** way, the 
2fc90 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
2fca0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2fcb0 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20  ot have to deal 
2fcc0 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76  with any.  ** ov
2fcd0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20  erflow cells in 
2fce0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
2fcf0 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78   since if any ex
2fd00 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a  isted they will.
2fd10 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64    ** have alread
2fd20 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a  y been removed..
2fd30 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65    */.  i = pPare
2fd40 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20  nt->nOverflow + 
2fd50 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a  pParent->nCell;.
2fd60 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20    if( i<2 ){.   
2fd70 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
2fd80 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65  nOld = i+1;.  }e
2fd90 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  lse{.    nOld = 
2fda0 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65  3;.    if( iPare
2fdb0 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20  ntIdx==0 ){     
2fdc0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
2fdd0 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
2fde0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72    }else if( iPar
2fdf0 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20  entIdx==i ){.   
2fe00 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a     nxDiv = i-2;.
2fe10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fe20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74   nxDiv = iParent
2fe30 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  Idx-1;.    }.   
2fe40 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66   i = 2;.  }.  if
2fe50 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
2fe60 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
2fe70 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2fe80 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
2fe90 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2fea0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2feb0 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
2fec0 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
2fed0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2fee0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2fef0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
2ff00 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2ff10 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
2ff20 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
2ff30 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2ff40 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
2ff50 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
2ff60 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  c ){.      memse
2ff70 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
2ff80 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
2ff90 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  *));.      goto 
2ffa0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2ffb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43  .    }.    nMaxC
2ffc0 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b  ells += 1+apOld[
2ffd0 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b  i]->nCell+apOld[
2ffe0 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  i]->nOverflow;. 
2fff0 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20     if( (i--)==0 
30000 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66  ) break;..    if
30010 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65  ( i+nxDiv==pPare
30020 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  nt->aOvfl[0].idx
30030 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   && pParent->nOv
30040 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
30050 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65  apDiv[i] = pPare
30060 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  nt->aOvfl[0].pCe
30070 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  ll;.      pgno =
30080 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
30090 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
300a0 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
300b0 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
300c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72  [i]);.      pPar
300d0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ent->nOverflow =
300e0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
300f0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
30100 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
30110 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
30120 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  t->nOverflow);. 
30130 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
30140 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
30150 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
30160 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
30170 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
30180 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20  ..      /* Drop 
30190 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  the cell from th
301a0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61  e parent page. a
301b0 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f  pDiv[i] still po
301c0 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ints to.      **
301d0 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
301e0 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65   the parent, eve
301f0 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20  n though it has 
30200 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20  been dropped..  
30210 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73      ** This is s
30220 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70  afe because drop
30230 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79  ping a cell only
30240 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
30250 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
30260 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c  our bytes of it,
30270 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
30280 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
30290 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
302a0 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
302b0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
302c0 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74  ll. So the point
302d0 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  er is safe to us
302e0 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72  e.      ** later
302f0 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a   on.  .      **.
30300 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
30310 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
30320 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c  ed in secure-del
30330 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ete mode. In thi
30340 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a 2a  s case,.      **
30350 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20   the dropCell() 
30360 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65  routine will ove
30370 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72  rwrite the entir
30380 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f  e cell with zero
30390 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20  es..      ** In 
303a0 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f  this case, tempo
303b0 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20  rarily copy the 
303c0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f  cell into the aO
303d0 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20  vflSpace[].     
303e0 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77   ** buffer. It w
303f0 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75  ill be copied ou
30400 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20  t again as soon 
30410 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20  as the aSpace[] 
30420 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20  buffer.      ** 
30430 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a  is allocated.  *
30440 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
30450 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
30460 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
30470 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  f = SQLITE_PTR_T
30480 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20  O_INT(apDiv[i]) 
30490 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  - SQLITE_PTR_TO_
304a0 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  INT(pParent->aDa
304b0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ta);.        if(
304c0 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29   (iOff+szNew[i])
304d0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
304e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
304f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30500 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
30510 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
30520 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
30530 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
30540 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
30550 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
30560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30570 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
30580 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
30590 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
305a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
305b0 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
305c0 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
305d0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
305e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
305f0 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
30600 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
30610 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
30620 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
30630 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
30640 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
30650 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
30660 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
30670 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
30680 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
30690 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
306a0 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
306b0 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
306c0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
306d0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
306e0 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
306f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
30700 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
30710 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
30720 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
30730 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
30740 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
30750 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
30760 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
30770 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
30780 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
30790 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
307a0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
307b0 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307d0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
307e0 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
307f0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
30800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
30820 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
30830 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
30840 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
30850 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
30860 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
30870 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
30880 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
30890 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
308a0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
308b0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
308c0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
308d0 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
308e0 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
308f0 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
30900 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
30910 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
30920 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
30930 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
30940 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
30950 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
30960 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
30970 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
30980 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
30990 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
309a0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
309b0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
309c0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
309d0 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
309e0 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
309f0 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
30a00 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
30a10 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
30a20 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
30a30 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
30a40 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
30a50 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
30a60 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
30a70 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
30a80 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
30a90 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
30aa0 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
30ab0 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
30ac0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
30ad0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
30ae0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
30af0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
30b00 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
30b10 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
30b20 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
30b30 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
30b40 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
30b50 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
30b60 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
30b70 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
30b80 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
30b90 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
30ba0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
30bb0 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
30bc0 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
30bd0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
30be0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
30bf0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
30c00 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
30c10 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
30c20 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
30c30 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65  n = apOld[0]->le
30c40 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
30c50 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73   = apOld[0]->has
30c60 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
30c70 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
30c80 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20     int limit;.  
30c90 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65    .    /* Before
30ca0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
30cb0 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70  else, take a cop
30cc0 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72  y of the i'th or
30cd0 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20  iginal sibling. 
30ce0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f     ** The rest o
30cf0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
30d00 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
30d10 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
30d20 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74  ther.    ** that
30d30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
30d40 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
30d50 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
30d60 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20  l be in the.    
30d70 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
30d80 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
30d90 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
30da0 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
30db0 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
30dc0 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
30dd0 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20  eSize + k*i];.  
30de0 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61    memcpy(pOld, a
30df0 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
30e00 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
30e10 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f  Old->aData = (vo
30e20 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20  id*)&pOld[1];.  
30e30 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61    memcpy(pOld->a
30e40 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
30e50 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
30e60 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69  Size);..    limi
30e70 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
30e80 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
30e90 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
30ea0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
30eb0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
30ec0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
30ed0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
30ee0 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
30ef0 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
30f00 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
30f10 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
30f20 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
30f30 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65  ell]);.      nCe
30f40 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
30f50 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20  if( i<nOld-1 && 
30f60 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20  !leafData){.    
30f70 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29    u16 sz = (u16)
30f80 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  szNew[i];.      
30f90 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
30fa0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
30fb0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
30fc0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
30fd0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d  = sz;.      pTem
30fe0 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
30ff0 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70  ace1];.      iSp
31000 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
31010 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
31020 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b  t->pageSize/4 );
31030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
31040 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
31050 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
31060 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
31070 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
31080 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
31090 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
310a0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
310b0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
310c0 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
310d0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
310e0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
310f0 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
31100 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
31110 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
31120 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
31130 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
31140 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
31150 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
31160 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
31170 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
31180 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
31190 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
311a0 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
311b0 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
311c0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
311d0 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
311e0 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
311f0 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
31200 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
31210 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
31220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31230 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
31240 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
31250 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
31260 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
31270 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
31280 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
31290 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
312a0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
312b0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
312c0 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
312d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
312e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
312f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
31300 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
31310 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
31320 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
31330 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
31340 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
31350 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
31360 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
31370 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
31380 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
31390 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
313a0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
313b0 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
313c0 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
313d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
313e0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
313f0 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
31400 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
31410 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
31420 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
31430 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
31440 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
31450 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
31460 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
31470 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
31480 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
31490 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
314a0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
314b0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
314c0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
314d0 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
314e0 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
314f0 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
31500 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
31510 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
31520 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
31530 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
31540 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
31550 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
31560 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
31570 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
31580 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
31590 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
315a0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
315b0 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
315c0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
315d0 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
315e0 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
315f0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
31600 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
31610 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
31620 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
31630 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
31640 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
31650 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
31660 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
31670 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
31680 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
31690 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
316a0 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
316b0 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
316c0 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
316d0 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
316e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
316f0 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  _BKPT; goto bala
31700 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
31710 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
31720 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
31730 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
31740 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
31750 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
31760 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
31770 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
31780 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
31790 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
317a0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
317b0 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
317c0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
317d0 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
317e0 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
317f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
31800 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
31810 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
31820 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
31830 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
31840 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
31850 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
31860 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
31870 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
31880 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
31890 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
318a0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
318b0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
318c0 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
318d0 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
318e0 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
318f0 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
31900 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
31910 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
31920 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
31930 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
31940 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
31950 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
31960 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
31970 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
31980 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
31990 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
319a0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
319b0 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
319c0 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
319d0 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
319e0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
319f0 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
31a00 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
31a10 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
31a20 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
31a30 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
31a40 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
31a50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
31a60 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
31a70 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
31a80 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
31a90 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
31aa0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
31ab0 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
31ac0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
31ad0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
31ae0 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
31af0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
31b00 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
31b10 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
31b20 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
31b30 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
31b40 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
31b50 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
31b60 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
31b70 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
31b80 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
31b90 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
31ba0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
31bb0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
31bc0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
31bd0 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
31be0 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
31bf0 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
31c00 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
31c10 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
31c20 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
31c30 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50  new[0])>0) or pP
31c40 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69  age is.  ** a vi
31c50 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
31c60 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
31c70 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
31c80 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
31c90 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
31ca0 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
31cb0 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
31cc0 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
31cd0 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
31ce0 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
31cf0 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
31d00 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
31d10 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
31d20 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
31d30 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
31d40 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
31d50 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
31d60 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
31d70 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
31d80 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
31d90 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
31da0 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
31db0 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
31dc0 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
31dd0 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
31de0 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
31df0 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
31e00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31e10 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  KPT;.    goto ba
31e20 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
31e30 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d   }.  pageFlags =
31e40 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61   apOld[0]->aData
31e50 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
31e60 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
31e70 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
31e80 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
31e90 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
31ea0 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
31eb0 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
31ec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
31ed0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31ee0 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
31ef0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
31f00 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
31f10 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
31f20 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
31f30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
31f40 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
31f50 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
31f60 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
31f70 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  pgno, pgno, 0);.
31f80 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
31f90 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
31fa0 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
31fb0 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
31fc0 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20    nNew++;..     
31fd0 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
31fe0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
31ff0 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
32000 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  g page. */.     
32010 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
32020 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  M ){.        ptr
32030 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
32040 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
32050 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
32060 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
32070 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32090 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
320a0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
320b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
320c0 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
320d0 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
320e0 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
320f0 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
32100 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
32110 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65  nOld ){.    free
32120 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26  Page(apOld[i], &
32130 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
32140 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
32150 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
32160 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
32170 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
32180 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
32190 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
321a0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
321b0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
321c0 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
321d0 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
321e0 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
321f0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
32200 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
32210 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
32220 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
32230 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
32240 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
32250 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
32260 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
32270 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
32280 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
32290 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
322a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
322b0 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
322c0 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
322d0 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
322e0 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
322f0 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
32300 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
32310 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
32320 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
32330 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
32340 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
32350 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
32360 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
32370 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
32380 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
32390 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
323a0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
323b0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
323c0 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
323d0 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77  int minV = apNew
323e0 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  [i]->pgno;.    i
323f0 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
32400 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
32410 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
32420 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c   apNew[j]->pgno<
32430 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
32440 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
32450 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
32460 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e   = apNew[j]->pgn
32470 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
32480 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
32490 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
324a0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
324b0 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61 70 4e  T;.      t = apN
324c0 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[i]->pgno;.   
324d0 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
324e0 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
324f0 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
32500 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
32510 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
32520 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a  }.  TRACE(("new:
32530 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
32540 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
32550 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65  %d)\n",.    apNe
32560 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65  w[0]->pgno, szNe
32570 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
32580 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67  2 ? apNew[1]->pg
32590 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  no : 0, nNew>=2 
325a0 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
325b0 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70      nNew>=3 ? ap
325c0 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[2]->pgno : 0
325d0 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
325e0 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
325f0 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d  ew>=4 ? apNew[3]
32600 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
32610 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
32620 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
32630 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f  ? apNew[4]->pgno
32640 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
32650 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
32660 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32670 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
32680 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
32690 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79  age) );.  put4by
326a0 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77  te(pRight, apNew
326b0 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
326c0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
326d0 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
326e0 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
326f0 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
32700 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
32710 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
32720 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
32730 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
32740 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
32750 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
32760 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
32770 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
32780 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
32790 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
327a0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
327b0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
327c0 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  lls );.    zeroP
327d0 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
327e0 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
327f0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
32800 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
32810 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
32820 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32830 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
32840 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
32850 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
32860 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
32870 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
32880 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
32890 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
328a0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
328b0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
328c0 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
328d0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
328e0 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
328f0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
32900 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
32910 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
32920 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c  ert( i<nNew-1 ||
32930 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20   j==nCell );.   
32940 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a   if( j<nCell ){.
32950 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
32960 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
32970 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
32980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
32990 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
329a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
329b0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
329c0 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
329d0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
329e0 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76      pTemp = &aOv
329f0 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61  flSpace[iOvflSpa
32a00 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ce];.      if( !
32a10 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
32a20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
32a30 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
32a40 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ell, 4);.      }
32a50 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
32a60 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
32a70 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
32a80 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
32a90 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
32aa0 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
32ab0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
32ac0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
32ad0 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
32ae0 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
32af0 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
32b00 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
32b10 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
32b20 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
32b30 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
32b40 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
32b50 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
32b60 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
32b70 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
32b80 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
32b90 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
32ba0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  --;.        btre
32bb0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
32bc0 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
32bd0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
32be0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
32bf0 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
32c00 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
32c10 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
32c20 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
32c30 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
32c40 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
32c50 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
32c60 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
32c70 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
32c80 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
32c90 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
32ca0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
32cb0 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
32cc0 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
32cd0 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
32ce0 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
32cf0 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
32d00 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
32d10 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
32d20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
32d30 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65  see btreeParseCe
32d40 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
32d50 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
32d60 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
32d70 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
32d80 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
32d90 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
32da0 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
32db0 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
32dc0 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
32dd0 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
32de0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
32df0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
32e00 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
32e10 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
32e20 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
32e30 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
32e40 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
32e50 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
32e60 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
32e70 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
32e80 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
32e90 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
32ea0 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
32eb0 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
32ec0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
32ed0 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
32ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
32ef0 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
32f00 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
32f10 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
32f20 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
32f30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32f40 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
32f50 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
32f60 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
32f70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
32f80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32f90 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d  iOvflSpace<=pBt-
32fa0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
32fb0 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
32fc0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43  arent, nxDiv, pC
32fd0 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20  ell, sz, pTemp, 
32fe0 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  pNew->pgno, &rc)
32ff0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33000 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
33010 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
33020 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33030 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33040 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
33050 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
33060 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
33070 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
33080 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
33090 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
330a0 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
330b0 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
330c0 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
330d0 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
330e0 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c  ){.    u8 *zChil
330f0 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  d = &apCopy[nOld
33100 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20  -1]->aData[8];. 
33110 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
33120 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
33130 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a  8], zChild, 4);.
33140 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f    }..  if( isRoo
33150 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  t && pParent->nC
33160 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e  ell==0 && pParen
33170 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70  t->hdrOffset<=ap
33180 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b  New[0]->nFree ){
33190 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
331a0 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
331b0 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  ree now contains
331c0 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f   no cells. The o
331d0 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nly sibling.    
331e0 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20 72  ** page is the r
331f0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
33200 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74  e parent. Copy t
33210 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
33220 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20  he.    ** child 
33230 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
33240 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67  rent, decreasing
33250 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69   the overall hei
33260 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ght of the.    *
33270 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  * b-tree structu
33280 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20  re by one. This 
33290 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20  is described as 
332a0 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61  the "balance-sha
332b0 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73  llower".    ** s
332c0 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20  ub-algorithm in 
332d0 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69  some documentati
332e0 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  on..    **.    *
332f0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
33300 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
33310 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74  base, the call t
33320 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  o copyNodeConten
33330 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73  t() .    ** sets
33340 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70   all pointer-map
33350 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70   entries corresp
33360 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  onding to databa
33370 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a  se image pages .
33380 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68      ** for which
33390 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
333a0 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68  stored within th
333b0 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
333c0 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  copied..    **. 
333d0 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
333e0 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65   assert below ve
333f0 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20  rifies that the 
33400 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64 65  child page is de
33410 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a  fragmented.    *
33420 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61  * (it must be, a
33430 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72 65  s it was just re
33440 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e  constructed usin
33450 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29  g assemblePage()
33460 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  ). This.    ** i
33470 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74  s important if t
33480 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 68  he parent page h
33490 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67  appens to be pag
334a0 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
334b0 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65  ase.    ** image
334c0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
334d0 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20  ( nNew==1 );.   
334e0 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30   assert( apNew[0
334f0 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20  ]->nFree == .   
33500 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28 26       (get2byte(&
33510 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b  apNew[0]->aData[
33520 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65  5])-apNew[0]->ce
33530 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30  llOffset-apNew[0
33540 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20  ]->nCell*2) .   
33550 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65   );.    copyNode
33560 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d  Content(apNew[0]
33570 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b  , pParent, &rc);
33580 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70  .    freePage(ap
33590 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20  New[0], &rc);.  
335a0 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f  }else if( ISAUTO
335b0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a  VACUUM ){.    /*
335c0 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   Fix the pointer
335d0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
335e0 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74   all the cells t
335f0 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64  hat were shifted
33600 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a   around. .    **
33610 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72   There are sever
33620 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70  al different typ
33630 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61  es of pointer-ma
33640 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e  p entries that n
33650 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
33660 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
33670 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d  his routine. Som
33680 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20  e of these have 
33690 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79  been set already
336a0 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e  , but.    ** man
336b0 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20  y have not. The 
336c0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73  following is a s
336d0 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20  ummary:.    **. 
336e0 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65     **   1) The e
336f0 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
33700 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69  d with new sibli
33710 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ng pages that we
33720 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20  re not.    **   
33730 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e     siblings when
33740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
33750 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65  as called. These
33760 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
33770 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73    **      been s
33780 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65  et. We don't nee
33790 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  d to worry about
337a0 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68   old siblings th
337b0 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20  at were.    **  
337c0 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65      moved to the
337d0 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65   free-list - the
337e0 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65   freePage() code
337f0 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a   has taken care.
33800 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74      **      of t
33810 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  hose..    **.   
33820 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69   **   2) The poi
33830 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
33840 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33850 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
33860 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  low.    **      
33870 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72  page in any over
33880 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64  flow chains used
33890 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20   by new divider 
338a0 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20  cells. These .  
338b0 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61    **      have a
338c0 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e  lso already been
338d0 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62   taken care of b
338e0 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c  y the insertCell
338f0 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a  () code..    **.
33900 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74      **   3) If t
33910 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
33920 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
33930 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
33940 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  pages of.    ** 
33950 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65       cells store
33960 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67  d on the sibling
33970 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20   pages may need 
33980 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
33990 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34     **.    **   4
339a0 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
339b0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69   pages are not i
339c0 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e  nternal intkey n
339d0 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20  odes, then any. 
339e0 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66     **      overf
339f0 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20 62  low pages used b
33a00 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61  y these cells ma
33a10 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
33a20 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  ated.    **     
33a30 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65   (internal intke
33a40 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f  y nodes never co
33a50 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
33a60 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
33a70 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
33a80 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69 62     5) If the sib
33a90 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
33aa0 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
33ab0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
33ac0 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72      **      entr
33ad0 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68  ies for the righ
33ae0 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  t-child pages of
33af0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61   each sibling ma
33b00 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20  y need.    **   
33b10 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64     to be updated
33b20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
33b30 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61 72  Cases 1 and 2 ar
33b40 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f  e dealt with abo
33b50 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65  ve by other code
33b60 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  . The next.    *
33b70 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  * block deals wi
33b80 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34  th cases 3 and 4
33b90 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74   and the one aft
33ba0 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e  er that, case 5.
33bb0 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65   Since.    ** se
33bc0 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  tting a pointer 
33bd0 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20 72  map entry is a r
33be0 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73  elatively expens
33bf0 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74  ive operation, t
33c00 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  his.    ** code 
33c10 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65  only sets pointe
33c20 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
33c30 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  r child or overf
33c40 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 68  low pages that h
33c50 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  ave.    ** actua
33c60 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65  lly moved betwee
33c70 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20  n pages.  */.   
33c80 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
33c90 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d   apNew[0];.    M
33ca0 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
33cb0 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e  pCopy[0];.    in
33cc0 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f  t nOverflow = pO
33cd0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
33ce0 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20     int iNextOld 
33cf0 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  = pOld->nCell + 
33d00 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
33d10 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  nt iOverflow = (
33d20 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64  nOverflow ? pOld
33d30 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a  ->aOvfl[0].idx :
33d40 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b   -1);.    j = 0;
33d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33d70 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69  Current 'old' si
33d80 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
33d90 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20    k = 0;        
33da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33db0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
33dc0 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61  'new' sibling pa
33dd0 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ge */.    for(i=
33de0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
33df0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44 69  {.      int isDi
33e00 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  vider = 0;.     
33e10 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74   while( i==iNext
33e20 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Old ){.        /
33e30 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20  * Cell i is the 
33e40 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  cell immediately
33e50 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
33e60 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a  ast cell on old.
33e70 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69          ** sibli
33e80 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68  ng page j. If th
33e90 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  e siblings are n
33ea0 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  ot leaf pages of
33eb0 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
33ec0 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68  ntkey b-tree, th
33ed0 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20  en cell i was a 
33ee0 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f  divider cell. */
33ef0 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20  .        pOld = 
33f00 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20  apCopy[++j];.   
33f10 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20       iNextOld = 
33f20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
33f30 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f  pOld->nCell + pO
33f40 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
33f50 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
33f60 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
33f70 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f          nOverflo
33f80 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
33f90 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  low;.          i
33fa0 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21  Overflow = i + !
33fb0 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
33fc0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20  >aOvfl[0].idx;. 
33fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33fe0 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65   isDivider = !le
33ff0 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20  afData;  .      
34000 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
34010 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69  nOverflow>0 || i
34020 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20  Overflow<i );.  
34030 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
34040 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<2 || pOld->
34050 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[0].idx==pO
34060 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78  ld->aOvfl[1].idx
34070 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  -1);.      asser
34080 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c  t(nOverflow<3 ||
34090 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e   pOld->aOvfl[1].
340a0 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c  idx==pOld->aOvfl
340b0 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20  [2].idx-1);.    
340c0 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c    if( i==iOverfl
340d0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ow ){.        is
340e0 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20  Divider = 1;.   
340f0 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65       if( (--nOve
34100 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20  rflow)>0 ){.    
34110 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b        iOverflow+
34120 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
34130 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
34140 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a  i==cntNew[k] ){.
34150 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
34160 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
34170 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
34180 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
34190 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20  l on new.       
341a0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
341b0 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   k. If the sibli
341c0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
341d0 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
341e0 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
341f0 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
34200 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20   i is a divider 
34210 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cell.  */.      
34220 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b    pNew = apNew[+
34230 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +k];.        if(
34240 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e   !leafData ) con
34250 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
34260 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
34270 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
34280 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
34290 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
342a0 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
342b0 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
342c0 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
342d0 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
342e0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
342f0 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
34300 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
34310 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
34320 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
34330 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
34340 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
34350 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
34360 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
34370 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
34380 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
34390 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
343a0 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
343b0 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
343c0 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
343d0 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
343e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
343f0 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
34400 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
34410 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
34420 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
34430 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
34440 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
34450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34460 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
34470 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
34480 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
34490 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
344a0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
344b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
344c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
344d0 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
344e0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
344f0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
34500 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
34510 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
34520 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
34530 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
34540 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
34550 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
34560 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
34570 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
34580 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
34590 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
345a0 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
345b0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
345c0 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
345d0 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
345e0 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
345f0 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
34600 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
34610 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
34620 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
34630 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
34640 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
34650 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
34660 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
34670 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
34680 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
34690 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
346a0 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
346b0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
346c0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
346d0 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
346e0 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
346f0 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
34700 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
34710 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
34720 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
34730 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
34740 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
34750 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
34760 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
34770 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
34780 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
34790 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
347a0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
347b0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
347c0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
347d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
347e0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
347f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
34800 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
34810 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
34820 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
34830 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
34840 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
34850 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f  lled when the ro
34860 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
34870 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
34880 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61  .** overfull (ha
34890 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
348a0 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a  erflow pages)..*
348b0 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64  *.** A new child
348c0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
348d0 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ed and the conte
348e0 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  nts of the curre
348f0 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c  nt root.** page,
34900 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66   including overf
34910 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63  low cells, are c
34920 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
34930 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a  hild. The root.*
34940 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f  * page is then o
34950 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61  verwritten to ma
34960 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70  ke it an empty p
34970 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67  age with the rig
34980 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69  ht-child .** poi
34990 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  nter pointing to
349a0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a   the new page..*
349b0 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
349c0 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74  rning, all point
349d0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
349e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
349f0 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74  pages .** that t
34a00 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67  he new child-pag
34a10 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70  e now contains p
34a20 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75  ointers to are u
34a30 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65  pdated. The.** e
34a40 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
34a50 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69  ng to the new ri
34a60 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
34a70 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  r of the root.**
34a80 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70   page is also up
34a90 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dated..**.** If 
34aa0 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43  successful, *ppC
34ab0 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63  hild is set to c
34ac0 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
34ad0 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  ce to the child 
34ae0 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c  .** page and SQL
34af0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
34b00 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
34b10 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
34b20 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61  equired.** to ca
34b30 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
34b40 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61   on *ppChild exa
34b50 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e  ctly once. If an
34b60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
34b70 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
34b80 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
34b90 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
34ba0 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
34bb0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
34bc0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  er(MemPage *pRoo
34bd0 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43  t, MemPage **ppC
34be0 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  hild){.  int rc;
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
34c10 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
34c20 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
34c30 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20  MemPage *pChild 
34c40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
34c50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
34c60 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
34c70 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
34c80 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
34c90 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
34ca0 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
34cb0 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
34cc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f  ared *pBt = pRoo
34cd0 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68  t->pBt;    /* Th
34ce0 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73  e BTree */..  as
34cf0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76  sert( pRoot->nOv
34d00 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73  erflow>0 );.  as
34d10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
34d20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
34d30 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tex) );..  /* Ma
34d40 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f  ke pRoot, the ro
34d50 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
34d60 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e  -tree, writable.
34d70 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
34d80 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20  .  ** page that 
34d90 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
34da0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
34db0 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74  of pPage. Copy t
34dc0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
34dd0 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f   of the node sto
34de0 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74  red on pRoot int
34df0 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  o the new child 
34e00 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  page..  */.  rc 
34e10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34e20 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
34e30 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
34e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34e50 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
34e60 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
34e70 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
34e80 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20  oot->pgno,0);.  
34e90 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e    copyNodeConten
34ea0 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c  t(pRoot, pChild,
34eb0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49   &rc);.    if( I
34ec0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
34ed0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
34ee0 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50  Bt, pgnoChild, P
34ef0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f  TRMAP_BTREE, pRo
34f00 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ot->pgno, &rc);.
34f10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
34f20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69  rc ){.    *ppChi
34f30 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  ld = 0;.    rele
34f40 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
34f50 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
34f60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
34f70 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34f80 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
34f90 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
34fa0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
34fb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
34fc0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
34fd0 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
34fe0 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e  >nCell==pRoot->n
34ff0 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45  Cell );..  TRACE
35000 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
35010 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
35020 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  \n", pRoot->pgno
35030 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
35040 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  ;..  /* Copy the
35050 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
35060 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43  from pRoot to pC
35070 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  hild */.  memcpy
35080 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20  (pChild->aOvfl, 
35090 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52  pRoot->aOvfl, pR
350a0 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73  oot->nOverflow*s
350b0 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76  izeof(pRoot->aOv
350c0 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c  fl[0]));.  pChil
350d0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
350e0 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Root->nOverflow;
350f0 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
35100 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f  contents of pRoo
35110 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20  t. Then install 
35120 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69  pChild as the ri
35130 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20  ght-child. */.  
35140 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
35150 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
35160 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
35170 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74   put4byte(&pRoot
35180 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
35190 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
351a0 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43  oChild);..  *ppC
351b0 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20  hild = pChild;. 
351c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
351d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
351e0 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63  page that pCur c
351f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
35200 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  to has just been
35210 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20   modified in.** 
35220 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66  some way. This f
35230 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20  unction figures 
35240 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69  out if this modi
35250 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74  fication means t
35260 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73  he.** tree needs
35270 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c   to be balanced,
35280 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73   and if so calls
35290 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
352a0 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72   balancing .** r
352b0 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e  outine. Balancin
352c0 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a  g routines are:.
352d0 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  **.**   balance_
352e0 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c  quick().**   bal
352f0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a  ance_deeper().**
35300 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f     balance_nonro
35310 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ot().*/.static i
35320 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
35330 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
35340 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35350 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d  ;.  const int nM
35360 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e  in = pCur->pBt->
35370 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f  usableSize * 2 /
35380 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63   3;.  u8 aBalanc
35390 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b  eQuickSpace[13];
353a0 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
353b0 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  ;..  TESTONLY( i
353c0 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
353d0 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20  _called = 0 );. 
353e0 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
353f0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
35400 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64  lled = 0 );..  d
35410 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  o {.    int iPag
35420 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
35430 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
35440 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
35450 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20  ge[iPage];..    
35460 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a  if( iPage==0 ){.
35470 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
35480 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
35490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f        /* The roo
354a0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
354b0 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  tree is overfull
354c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
354d0 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20  all the.        
354e0 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ** balance_deepe
354f0 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
35500 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  create a new chi
35510 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ld for the root-
35520 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
35530 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72  and copy the cur
35540 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
35550 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
35560 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20  o it. The.      
35570 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
35580 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
35590 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
355a0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  the child page..
355b0 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
355c0 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
355d0 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
355e0 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
355f0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
35600 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26  _deeper(pPage, &
35610 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29  pCur->apPage[1])
35620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35640 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
35650 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
35660 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
35670 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
35680 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d    pCur->aiIdx[1]
35690 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
356a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
356b0 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c  Page[1]->nOverfl
356c0 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow );.        }.
356d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
356e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
356f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
35700 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
35710 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
35720 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20  nFree<=nMin ){. 
35730 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d  }else{.      Mem
35750 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61  Page * const pPa
35760 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
35770 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20  age[iPage-1];.  
35780 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49      int const iI
35790 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
357a0 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20  [iPage-1];..    
357b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
357c0 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
357d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
357e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
357f0 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  _OK ){.#ifndef S
35800 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
35810 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20  BALANCE.        
35820 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
35830 74 61 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ta.         && p
35840 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
35850 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
35860 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  Page->aOvfl[0].i
35870 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
35880 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
35890 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20  rent->pgno!=1.  
358a0 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e         && pParen
358b0 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20  t->nCell==iIdx. 
358c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
358d0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61      /* Call bala
358e0 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63  nce_quick() to c
358f0 72 65 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c  reate a new sibl
35900 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20  ing of pPage on 
35910 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 20 20  which.          
35920 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
35930 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62  overflow cell. b
35940 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
35950 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c  nserts a new cel
35960 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  l.          ** i
35970 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69  nto pParent, whi
35980 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61  ch may cause pPa
35990 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49  rent overflow. I
359a0 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  f this.         
359b0 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
359c0 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e   next interation
359d0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
359e0 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61  will balance pPa
359f0 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20  rent .          
35a00 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20 62 61  ** use either ba
35a10 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
35a20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  or balance_deepe
35a30 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a  r(). Until this.
35a40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
35a50 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c  pens, the overfl
35a60 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65  ow cell is store
35a70 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63  d in the aBalanc
35a80 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20  eQuickSpace[].  
35a90 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
35aa0 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  r. .          **
35ab0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
35ac0 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65  e purpose of the
35ad0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
35ae0 74 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20  t() is to check 
35af0 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20  that only a.    
35b00 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
35b10 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
35b20 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20  quick() is made 
35b30 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f  for each call to
35b40 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
35b50 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  ** function. If 
35b60 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65  this were not ve
35b70 72 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65  rified, a subtle
35b80 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72   bug involving r
35b90 65 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a  euse.          *
35ba0 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63  * of the aBalanc
35bb0 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69  eQuickSpace[] mi
35bc0 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20  ght sneak in..  
35bd0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35be0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61       assert( (ba
35bf0 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c  lance_quick_call
35c00 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
35c10 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
35c20 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74  ce_quick(pParent
35c30 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63  , pPage, aBalanc
35c40 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20  eQuickSpace);.  
35c50 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
35c60 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
35c70 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69         /* In thi
35c80 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c  s case, call bal
35c90 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74  ance_nonroot() t
35ca0 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20 63  o redistribute c
35cb0 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
35cc0 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67 65 20  * between pPage 
35cd0 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69  and up to 2 of i
35ce0 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ts sibling pages
35cf0 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a  . This involves.
35d00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64            ** mod
35d10 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
35d20 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20  nts of pParent, 
35d30 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
35d40 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20  pParent to.     
35d50 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f       ** become o
35d60 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
35d70 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69  full. The next i
35d80 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
35d90 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20  do-loop.        
35da0 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63    ** will balanc
35db0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
35dc0 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69  e to correct thi
35dd0 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s..          ** 
35de0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
35df0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
35e00 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
35e10 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  l, the overflow 
35e20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20  cell or cells.  
35e30 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73          ** are s
35e40 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53 70  tored in the pSp
35e50 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  ace buffer alloc
35e60 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ated immediately
35e70 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20   below. .       
35e80 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65     ** A subseque
35e90 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  nt iteration of 
35ea0 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
35eb0 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 73 20   deal with this 
35ec0 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  by.          ** 
35ed0 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f  calling balance_
35ee0 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e  nonroot() (balan
35ef0 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20  ce_deeper() may 
35f00 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c  be called first,
35f10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
35f20 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61  t it doesn't dea
35f30 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  l with overflow 
35f40 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76  cells - just mov
35f50 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20  es them to a.   
35f60 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72         ** differ
35f70 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20  ent page). Once 
35f80 74 68 69 73 20 73 75 62 73 65 71 75 65 6e 74 20  this subsequent 
35f90 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
35fa0 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20  nonroot() .     
35fb0 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70       ** has comp
35fc0 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73 61 66  leted, it is saf
35fd0 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  e to release the
35fe0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75   pSpace buffer u
35ff0 73 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 20  sed by.         
36000 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73   ** the previous
36010 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76   call, as the ov
36020 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61  erflow cell data
36030 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
36040 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
36050 70 69 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f  pied either into
36060 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64   the body of a d
36070 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 20  atabase page or 
36080 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
36090 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65         ** pSpace
360a0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74   buffer passed t
360b0 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c  o the latter cal
360c0 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
360d0 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20  root()..        
360e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
360f0 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69  8 *pSpace = sqli
36100 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43  te3PageMalloc(pC
36110 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ur->pBt->pageSiz
36120 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
36130 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
36140 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ot(pParent, iIdx
36150 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d  , pSpace, iPage=
36160 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  =1);.          i
36170 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
36180 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
36190 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ree is not NULL,
361a0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
361b0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
361c0 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 20 20  used .          
361d0 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f    ** by a previo
361e0 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  us call to balan
361f0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74  ce_nonroot(). It
36200 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20  s contents are. 
36210 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f             ** no
36220 77 20 73 74 6f 72 65 64 20 65 69 74 68 65 72 20  w stored either 
36230 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61 73 65  on real database
36240 20 70 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e   pages or within
36250 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
36260 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20    ** new pSpace 
36270 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61  buffer, so it ma
36280 79 20 62 65 20 73 61 66 65 6c 79 20 66 72 65 65  y be safely free
36290 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  d here. */.     
362a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
362b0 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
362c0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
362d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70        /* The pSp
362e0 61 63 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20  ace buffer will 
362f0 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20 74  be freed after t
36300 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a  he next call to.
36310 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c            ** bal
36320 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20  ance_nonroot(), 
36330 6f 72 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  or just before t
36340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
36350 75 72 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a  urns, whichever.
36360 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d            ** com
36370 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  es first. */.   
36380 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70         pFree = p
36390 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d  Space;.        }
363a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
363b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
363c0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
363d0 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  The next iterati
363e0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
363f0 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70  p balances the p
36400 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20  arent page. */. 
36410 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
36420 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  (pPage);.      p
36430 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
36440 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
36450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
36460 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
36470 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
36480 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  ee(pFree);.  }. 
36490 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
364a0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
364b0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
364c0 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b  he BTree.  The k
364d0 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ey is given by (
364e0 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e  pKey,nKey).** an
364f0 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69  d the data is gi
36500 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44  ven by (pData,nD
36510 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f  ata).  The curso
36520 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  r is used only t
36530 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74  o.** define what
36540 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72   table the recor
36550 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  d should be inse
36560 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20  rted into.  The 
36570 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
36580 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
36590 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
365a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e  .**.** For an IN
365b0 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79  TKEY table, only
365c0 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20   the nKey value 
365d0 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  of the key is us
365e0 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
365f0 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20  ignored.  For a 
36600 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20  ZERODATA table, 
36610 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44  the pData and nD
36620 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e  ata are both ign
36630 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
36640 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
36650 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
36660 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63  ero, then a succ
36670 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a  essful call to.*
36680 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  * MovetoUnpacked
36690 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f  () to seek curso
366a0 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c  r pCur to (pKey,
366b0 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61   nKey) has alrea
366c0 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f  dy.** been perfo
366d0 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74  rmed. seekResult
366e0 20 69 73 20 74 68 65 20 73 65 61 72 63 68 20 72   is the search r
366f0 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28  esult returned (
36700 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75  a negative.** nu
36710 6d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f 69  mber if pCur poi
36720 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20  nts at an entry 
36730 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  that is smaller 
36740 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79  than (pKey, nKey
36750 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74  ), or.** a posit
36760 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43 75  ive value if pCu
36770 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65  r points at an e
36780 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72 67  try that is larg
36790 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65  er than .** (pKe
367a0 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a  y, nKey)). .**.*
367b0 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
367c0 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
367d0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
367e0 74 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  the caller guara
367f0 6e 74 65 65 73 20 74 68 61 74 0a 2a 2a 20 63 75  ntees that.** cu
36800 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
36810 6e 74 69 6e 67 20 61 74 20 74 68 65 20 65 78 69  nting at the exi
36820 73 74 69 6e 67 20 63 6f 70 79 20 6f 66 20 61 20  sting copy of a 
36830 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f 20 62  row that is to b
36840 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e  e.** overwritten
36850 2e 20 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  .  If the seekRe
36860 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
36870 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  s 0, then cursor
36880 20 70 43 75 72 20 6d 61 79 0a 2a 2a 20 70 6f 69   pCur may.** poi
36890 6e 74 20 74 6f 20 61 6e 79 20 65 6e 74 72 79 20  nt to any entry 
368a0 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61  or to no entry a
368b0 74 20 61 6c 6c 20 61 6e 64 20 73 6f 20 74 68 69  t all and so thi
368c0 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  s function has t
368d0 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75  o seek.** the cu
368e0 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20  rsor before the 
368f0 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69  new key can be i
36900 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
36910 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
36920 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rt(.  BtCursor *
36930 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
36940 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
36950 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62  ata into the tab
36960 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f  le of this curso
36970 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  r */.  const voi
36980 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
36990 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
369a0 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
369b0 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
369c0 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
369d0 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61  Data,  /* The da
369e0 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ta of the new re
369f0 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  cord */.  int nZ
36a00 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
36a10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36a20 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79  er of extra 0 by
36a30 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
36a40 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61   data */.  int a
36a50 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20  ppendBias,      
36a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
36a70 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b  e if this is lik
36a80 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f  ely an append */
36a90 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c  .  int seekResul
36aa0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
36ab0 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70    /* Result of p
36ac0 72 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63  rior MovetoUnpac
36ad0 6b 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b  ked() call */.){
36ae0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
36af0 20 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c   loc = seekResul
36b00 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d  t;          /* -
36b10 31 3a 20 62 65 66 6f 72 65 20 64 65 73 69 72 65  1: before desire
36b20 64 20 6c 6f 63 61 74 69 6f 6e 20 20 2b 31 3a 20  d location  +1: 
36b30 61 66 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  after */.  int s
36b40 7a 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zNew = 0;.  int 
36b50 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
36b60 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
36b70 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
36b80 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
36b90 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
36ba0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
36bb0 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
36bc0 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
36bd0 20 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d   0;..  if( pCur-
36be0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
36bf0 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73 73  FAULT ){.    ass
36c00 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
36c10 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
36c20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  ;.    return pCu
36c30 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
36c40 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
36c50 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
36c60 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
36c70 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
36c80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
36c90 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
36ca0 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
36cb0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  y );.  assert( h
36cc0 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
36cd0 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e  leLock(p, pCur->
36ce0 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e  pgnoRoot, pCur->
36cf0 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20  pKeyInfo!=0, 2) 
36d00 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
36d10 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
36d20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 69 73 74  has been consist
36d30 65 6e 74 2e 20 49 66 20 74 68 69 73 20 63 75 72  ent. If this cur
36d40 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 0a 20  sor was opened. 
36d50 20 2a 2a 20 65 78 70 65 63 74 69 6e 67 20 61 6e   ** expecting an
36d60 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 74   index b-tree, t
36d70 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 73  hen the caller s
36d80 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69  hould be inserti
36d90 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65 79  ng blob.  ** key
36da0 73 20 77 69 74 68 20 6e 6f 20 61 73 73 6f 63 69  s with no associ
36db0 61 74 65 64 20 64 61 74 61 2e 20 49 66 20 74 68  ated data. If th
36dc0 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
36dd0 6e 65 64 20 65 78 70 65 63 74 69 6e 67 20 61 6e  ned expecting an
36de0 0a 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62  .  ** intkey tab
36df0 6c 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73  le, the caller s
36e00 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69  hould be inserti
36e10 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  ng integer keys 
36e20 77 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c 6f 62  with a.  ** blob
36e30 20 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20 64   of associated d
36e40 61 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ata.  */.  asser
36e50 74 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d 28 70  t( (pKey==0)==(p
36e60 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
36e70 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
36e80 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20  is is an insert 
36e90 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74  into a table b-t
36ea0 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  ree, invalidate 
36eb0 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20  any incrblob .  
36ec0 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
36ed0 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  on the row being
36ee0 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d   replaced (assum
36ef0 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65  ing this is a re
36f00 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61  place.  ** opera
36f10 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20  tion - if it is 
36f20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  not, the followi
36f30 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20  ng is a no-op). 
36f40 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
36f50 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pKeyInfo==0 ){. 
36f60 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63     invalidateInc
36f70 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20  rblobCursors(p, 
36f80 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
36f90 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
36fa0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
36fb0 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
36fc0 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a   on this table..
36fd0 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d    **.  ** In som
36fe0 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  e cases, the cal
36ff0 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f  l to btreeMoveto
37000 28 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f  () below is a no
37010 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78  -op. For.  ** ex
37020 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65  ample, when inse
37030 72 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f 20  rting data into 
37040 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 75 74  a table with aut
37050 6f 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74 65  o-generated inte
37060 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74  ger.  ** keys, t
37070 68 65 20 56 44 42 45 20 6c 61 79 65 72 20 69 6e  he VDBE layer in
37080 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74 72  vokes sqlite3Btr
37090 65 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67 75  eeLast() to figu
370a0 72 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a  re out the .  **
370b0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f 20   integer key to 
370c0 75 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61 6c  use. It then cal
370d0 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
370e0 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e 73   to actually ins
370f0 65 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ert the .  ** da
37100 74 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b  ta into the intk
37110 65 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  ey B-Tree. In th
37120 69 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f 76  is case btreeMov
37130 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73  eto() recognizes
37140 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
37150 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
37160 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20   where it needs 
37170 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e  to be and return
37180 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64  s without.  ** d
37190 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54  oing any work. T
371a0 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e  o avoid thwartin
371b0 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  g these optimiza
371c0 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70  tions, it is imp
371d0 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20  ortant.  ** not 
371e0 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72  to clear the cur
371f0 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  sor here..  */. 
37200 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
37210 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
37220 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b  pgnoRoot, pCur);
37230 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
37240 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 21 6c 6f  rn rc;.  if( !lo
37250 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  c ){.    rc = bt
37260 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
37270 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
37280 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b 0a 20  ndBias, &loc);. 
37290 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
372a0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
372b0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
372c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
372d0 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65  || (pCur->eState
372e0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
372f0 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70   && loc) );..  p
37300 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
37310 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
37320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37330 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
37340 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
37350 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
37360 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
37370 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 49 4e  );..  TRACE(("IN
37380 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e  SERT: table=%d n
37390 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25  key=%lld ndata=%
373a0 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c  d page=%d %s\n",
373b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
373c0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c  >pgnoRoot, nKey,
373d0 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70   nData, pPage->p
373e0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  gno,.          l
373f0 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69  oc==0 ? "overwri
37400 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79  te" : "new entry
37410 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  "));.  assert( p
37420 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
37430 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
37440 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43  ace(pBt);.  newC
37450 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
37460 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43  pace;.  if( newC
37470 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
37480 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
37490 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
374a0 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20  pPage, newCell, 
374b0 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74  pKey, nKey, pDat
374c0 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c  a, nData, nZero,
374d0 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20   &szNew);.  if( 
374e0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
374f0 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  sert;.  assert( 
37500 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50  szNew==cellSizeP
37510 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  tr(pPage, newCel
37520 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
37530 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53  szNew<=MX_CELL_S
37540 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64  IZE(pBt) );.  id
37550 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
37560 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
37570 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20  if( loc==0 ){.  
37580 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20    u16 szOld;.   
37590 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
375a0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
375b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
375c0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
375d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
375e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
375f0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
37600 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20    }.    oldCell 
37610 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
37620 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  , idx);.    if( 
37630 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
37640 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
37650 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
37660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
37670 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
37680 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
37690 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
376a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
376b0 65 6c 6c 29 3b 0a 20 20 20 20 64 72 6f 70 43 65  ell);.    dropCe
376c0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73  ll(pPage, idx, s
376d0 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20  zOld, &rc);.    
376e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
376f0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  d_insert;.  }els
37700 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
37710 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
37720 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37730 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
37740 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
37750 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
37760 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
37770 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
37780 61 66 20 29 3b 0a 20 20 7d 0a 20 20 69 6e 73 65  af );.  }.  inse
37790 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
377a0 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
377b0 77 2c 20 30 2c 20 30 2c 20 26 72 63 29 3b 0a 20  w, 0, 0, &rc);. 
377c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
377d0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
377e0 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
377f0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
37800 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
37810 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
37820 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e  and pPage has an
37830 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
37840 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a  call balance() .
37850 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69    ** to redistri
37860 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77  bute the cells w
37870 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20  ithin the tree. 
37880 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20  Since balance() 
37890 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68  may move.  ** th
378a0 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74  e cursor, zero t
378b0 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
378c0 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72  .nSize and BtCur
378d0 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20  sor.validNKey.  
378e0 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  ** variables..  
378f0 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  **.  ** Previous
37900 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
37910 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54  ite called moveT
37920 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20  oRoot() to move 
37930 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
37940 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74  back to the root
37950 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65   page as balance
37960 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c  () used to inval
37970 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
37980 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72  ts.  ** of BtCur
37990 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  sor.apPage[] and
379a0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b   BtCursor.aiIdx[
379b0 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f  ]. Instead of do
379c0 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73  ing that,.  ** s
379d0 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
379e0 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22  ate to "invalid"
379f0 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d  . This makes com
37a00 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61  mon insert opera
37a10 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68  tions.  ** sligh
37a20 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a  tly faster..  **
37a30 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61  .  ** There is a
37a40 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f   subtle but impo
37a50 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  rtant optimizati
37a60 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65  on here too. Whe
37a70 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a  n inserting.  **
37a80 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64   multiple record
37a90 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79  s into an intkey
37aa0 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20   b-tree using a 
37ab0 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61  single cursor (a
37ac0 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65  s can.  ** happe
37ad0 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  n while processi
37ae0 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e  ng an "INSERT IN
37af0 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73  TO ... SELECT" s
37b00 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20  tatement), it.  
37b10 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f  ** is advantageo
37b20 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  us to leave the 
37b30 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
37b40 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
37b50 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d  y in.  ** the b-
37b60 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65  tree if possible
37b70 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
37b80 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
37b90 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a   to the last.  *
37ba0 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
37bb0 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65  able, and the ne
37bc0 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20  xt row inserted 
37bd0 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b  has an integer k
37be0 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74  ey.  ** larger t
37bf0 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
37c00 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74  existing key, it
37c10 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
37c20 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20  insert the.  ** 
37c30 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b  row without seek
37c40 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ing the cursor. 
37c50 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69  This can be a bi
37c60 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  g performance bo
37c70 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  ost..  */.  pCur
37c80 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
37c90 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
37ca0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Key = 0;.  if( r
37cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
37cc0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
37cd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
37ce0 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20  ance(pCur);..   
37cf0 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
37d00 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
37d10 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
37d20 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
37d30 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73  e().    ** fails
37d40 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  . Internal data 
37d50 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
37d60 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
37d70 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20   otherwise. .   
37d80 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68   ** Also, set th
37d90 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
37da0 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20  o invalid. This 
37db0 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72  stops saveCursor
37dc0 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a  Position().    *
37dd0 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
37de0 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
37df0 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
37e00 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20  e cursor.  */.  
37e10 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
37e20 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
37e30 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
37e40 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
37e50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
37e60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
37e70 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
37e80 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
37e90 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73  w==0 );..end_ins
37ea0 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ert:.  return rc
37eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
37ec0 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
37ed0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
37ee0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
37ef0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
37f00 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
37f10 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74   arbitrary locat
37f20 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
37f30 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42  te3BtreeDelete(B
37f40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
37f50 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
37f60 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
37f70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
37f80 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
37f90 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20    .  int rc;    
37fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
37fc0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
37fd0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ff0 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65     /* Page to de
38000 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a  lete cell from *
38010 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
38020 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  r *pCell;       
38030 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
38040 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64  ter to cell to d
38050 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
38060 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20  CellIdx;        
38070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38080 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
38090 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
380a0 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20  int iCellDepth; 
380b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
380c0 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66       /* Depth of
380d0 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67   node containing
380e0 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73   pCell */ ..  as
380f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
38100 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
38110 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
38120 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
38130 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
38140 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
38150 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
38160 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  t( pCur->wrFlag 
38170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  );.  assert( has
38180 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
38190 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67  Lock(p, pCur->pg
381a0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b  noRoot, pCur->pK
381b0 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b  eyInfo!=0, 2) );
381c0 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52  .  assert( !hasR
381d0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
381e0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20  pCur->pgnoRoot) 
381f0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
38200 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
38210 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e  ->iPage]>=pCur->
38220 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
38230 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20  ge]->nCell) .   
38240 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  || NEVER(pCur->e
38250 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
38260 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  LID).  ){.    re
38270 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
38280 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  R;  /* Something
38290 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20   has gone awry. 
382a0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  */.  }..  /* If 
382b0 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65  this is a delete
382c0 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65   operation to re
382d0 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  move a row from 
382e0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a  a table b-tree,.
382f0 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20    ** invalidate 
38300 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
38310 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
38320 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
38330 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  ed.  */.  if( pC
38340 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
38350 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
38360 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
38370 28 70 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  (p, pCur->info.n
38380 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
38390 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75  iCellDepth = pCu
383a0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c  r->iPage;.  iCel
383b0 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  lIdx = pCur->aiI
383c0 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a  dx[iCellDepth];.
383d0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
383e0 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74  apPage[iCellDept
383f0 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  h];.  pCell = fi
38400 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
38410 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49  ellIdx);..  /* I
38420 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  f the page conta
38430 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20  ining the entry 
38440 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
38450 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f   a leaf page, mo
38460 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  ve.  ** the curs
38470 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  or to the larges
38480 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
38490 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ree that is smal
384a0 6c 65 72 20 74 68 61