/ Hex Artifact Content
Login

Artifact 28c3975060209dc5c5ca91abaa5e034dab03539f:


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 70 61 67 65 72 50 61  tic Pgno pagerPa
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 69 6e 74 20 6e 50   *pBt){.  int nP
cb60: 61 67 65 20 3d 20 28 69 6e 74 29 70 42 74 2d 3e  age = (int)pBt->
cb70: 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
cb80: 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
cb90: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
cba0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
cbb0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
cbc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
cbd0: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
cbe0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
cbf0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
cc00: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
cc10: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
cc20: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
cc30: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
cc40: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
cc50: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
cc60: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
cc70: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
cc80: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
cc90: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
cca0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
ccb0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
ccc0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
ccd0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
cce0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
ccf0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
cd00: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
cd10: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
cd20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
cd30: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
cd40: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
cd50: 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e     /* Write t
cd60: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
cd70: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
cd80: 20 72 63 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28   rc;.  TESTONLY(
cd90: 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 20 3d 20   Pgno iLastPg = 
cda0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
cdb0: 42 74 29 3b 20 29 0a 20 20 61 73 73 65 72 74 28  Bt); ).  assert(
cdc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cdd0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
cde0: 29 3b 0a 0a 20 20 72 63 20 3d 20 62 74 72 65 65  );..  rc = btree
cdf0: 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
ce00: 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
ce10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ce20: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
ce30: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
ce40: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
ce50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ce60: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
ce70: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
ce80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
ce90: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
cea0: 65 20 6e 75 6d 62 65 72 20 77 61 73 20 65 69 74  e number was eit
ceb0: 68 65 72 20 30 20 6f 72 20 67 72 65 61 74 65 72  her 0 or greater
cec0: 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 0a 20   than the page. 
ced0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74 68   ** number of th
cee0: 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
cef0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  he database, thi
cf00: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
cf10: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  d return.  ** SQ
cf20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
cf30: 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
cf40: 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 46 55   (i.e. SQLITE_FU
cf50: 4c 4c 29 2e 20 43 68 65 63 6b 20 74 68 61 74 20  LL). Check that 
cf60: 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  this.  ** is the
cf70: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
cf80: 65 72 74 28 20 28 70 67 6e 6f 3e 30 20 26 26 20  ert( (pgno>0 && 
cf90: 70 67 6e 6f 3c 3d 69 4c 61 73 74 50 67 29 20 7c  pgno<=iLastPg) |
cfa0: 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
cfb0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
cfc0: 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  gno==0 );.  test
cfd0: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 69 4c 61 73  case( pgno==iLas
cfe0: 74 50 67 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tPg );..  return
cff0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
d000: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
d010: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
d020: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
d030: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
d040: 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
d050: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
d060: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
d070: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
d080: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
d090: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d0a0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
d0b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d0c0: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
d0d0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
d0e0: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
d0f0: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
d100: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
d110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d120: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d130: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
d140: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
d150: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d160: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d170: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d180: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
d190: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
d1a0: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
d1b0: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
d1c0: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
d1d0: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
d1e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
d1f0: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
d200: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
d210: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
d220: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
d230: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
d240: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
d250: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
d260: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
d270: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d280: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
d290: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
d2a0: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
d2b0: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
d2c0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
d2d0: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
d2e0: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
d2f0: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
d300: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
d310: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
d320: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
d330: 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
d340: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
d350: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
d360: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
d370: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
d380: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
d390: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
d3a0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
d3b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d3c0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d3d0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d3e0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
d3f0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
d400: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
d410: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
d420: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
d430: 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
d440: 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
d450: 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
d460: 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
d470: 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
d480: 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
d490: 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
d4a0: 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
d4b0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
d4c0: 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
d4d0: 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
d4e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d4f0: 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
d500: 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
d510: 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
d520: 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
d530: 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
d540: 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
d550: 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
d560: 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
d570: 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
d580: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
d590: 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
d5a0: 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
d5b0: 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
d5c0: 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
d5d0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
d5e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
d5f0: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
d600: 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
d610: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
d620: 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
d630: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
d640: 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
d650: 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
d660: 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
d670: 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
d680: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d690: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d6a0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
d6b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
d6c0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
d6d0: 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
d6e0: 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
d6f0: 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
d700: 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
d710: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
d720: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
d730: 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
d740: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
d750: 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ** a new databas
d760: 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20  e with a random 
d770: 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e  name is created.
d780: 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20    This randomly 
d790: 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73  named.** databas
d7a0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
d7b0: 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69  eleted when sqli
d7c0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
d7d0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66  is called..** If
d7e0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
d7f0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
d800: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
d810: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
d820: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
d830: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
d840: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
d850: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
d860: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
d870: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
d880: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
d890: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
d8a0: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
d8b0: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
d8c0: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
d8d0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
d8e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
d8f0: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
d900: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
d910: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
d920: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
d930: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
d940: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
d950: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
d960: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
d970: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
d980: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
d990: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
d9a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d9b0: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
d9c0: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
d9d0: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
d9e0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
d9f0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
da00: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
da10: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
da20: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
da30: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
da40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
da50: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
da60: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
da70: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
da80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
da90: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
daa0: 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
dab0: 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
dac0: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
dad0: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
dae0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
daf0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
db00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
db10: 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
db20: 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74  is btree */.  Bt
db30: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db50: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
db60: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
db70: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
dba0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
dbb0: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
dbc0: 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
dbd0: 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
dbe0: 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
dbf0: 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
dc00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
dc20: 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
dc30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
dc40: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
dc70: 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
dc80: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
dc90: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
dca0: 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
dcb0: 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
dcc0: 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74  ent */..  /* Set
dcd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
dce0: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
dcf0: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
dd00: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
dd10: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
dd20: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
dd30: 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69  e. This symbol i
dd40: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
dd50: 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  if.  ** either o
dd60: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
dd70: 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20  a or autovacuum 
dd80: 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d  features are com
dd90: 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f  piled .  ** into
dda0: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20   the library..  
ddb0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
ddc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
ddd0: 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65  ED_CACHE) || !de
dde0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ddf0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20  T_AUTOVACUUM).  
de00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
de10: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
de20: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
de30: 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20  b = 0;.  #else. 
de40: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
de50: 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  emdb = zFilename
de60: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c   && !strcmp(zFil
de70: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
de80: 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e  ");.  #endif.#en
de90: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
dea0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
deb0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dec0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
ded0: 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d  );..  pVfs = db-
dee0: 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c  >pVfs;.  p = sql
def0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
df00: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
df10: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
df20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
df30: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
df40: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
df50: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
df60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
df70: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
df80: 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
df90: 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
dfa0: 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
dfb0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
dfc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
dfd0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
dfe0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dff0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
e000: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
e010: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
e020: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
e030: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
e040: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
e050: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
e060: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
e070: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
e080: 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20   if( isMemdb==0 
e090: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  && zFilename && 
e0a0: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
e0b0: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
e0c0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
e0d0: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
e0e0: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
e0f0: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
e100: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
e110: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
e120: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
e130: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
e140: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
e150: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
e160: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
e170: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
e180: 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
e190: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
e1a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e1b0: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
e1c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e1d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e1e0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e1f0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
e200: 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e  name, nFullPathn
e210: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
e220: 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  me);.      mutex
e230: 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
e240: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
e250: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
e260: 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
e270: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
e280: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
e290: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
e2a0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
e2b0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
e2c0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
e2d0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e2e0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
e2f0: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
e300: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
e310: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
e320: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
e330: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
e340: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e350: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
e360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
e370: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
e380: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
e390: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
e3a0: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
e3b0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
e3c0: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
e3d0: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
e3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
e3f0: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
e400: 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
e410: 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
e420: 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
e430: 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
e440: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
e450: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
e460: 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
e470: 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
e480: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
e490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
e4a0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e4b0: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
e4c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
e4d0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e4e0: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
e4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e500: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e510: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
e530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
e540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
e550: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
e560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e570: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
e580: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
e590: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
e5a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
e5b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e5c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e5d0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
e5e0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
e5f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e600: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e610: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
e620: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
e630: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
e640: 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
e650: 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
e660: 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
e670: 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
e680: 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
e690: 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
e6a0: 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
e6b0: 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
e6c0: 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
e6d0: 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
e6e0: 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
e6f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
e700: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
e710: 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
e720: 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
e730: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
e740: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
e750: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
e760: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
e770: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
e780: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
e790: 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
e7a0: 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
e7b0: 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
e7c0: 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
e7d0: 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
e7e0: 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
e7f0: 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
e800: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
e810: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
e820: 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
e830: 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
e840: 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
e850: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e860: 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(i64)==8 || siz
e870: 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(i64)==4 );. 
e880: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e890: 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(u64)==8 || siz
e8a0: 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(u64)==4 );. 
e8b0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e8c0: 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
e8d0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e8e0: 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
e8f0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
e900: 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
e910: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
e920: 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
e930: 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
e940: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
e950: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
e960: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
e970: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
e980: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
e990: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
e9a0: 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
e9b0: 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53           EXTRA_S
e9e0: 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  IZE, flags, vfsF
e9f0: 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74  lags, pageReinit
ea00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ea10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ea20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ea30: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
ea40: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
ea50: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
ea60: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
ea70: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
ea80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ea90: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
eaa0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
eab0: 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
eac0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
ead0: 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
eae0: 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
eaf0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
eb00: 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
eb10: 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
eb20: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
eb30: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
eb40: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
eb50: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69  >readOnly = sqli
eb60: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
eb70: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ly(pBt->pPager);
eb80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
eb90: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
eba0: 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65   pBt->secureDele
ebb0: 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  te = 1;.#endif. 
ebc0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
ebd0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62   = get2byte(&zDb
ebe0: 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20  Header[16]);.   
ebf0: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
ec00: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
ec10: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
ec20: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
ec30: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
ec40: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
ec50: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
ec60: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
ec70: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
ec80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ec90: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
eca0: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
ecb0: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
ecc0: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
ecd0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
ece0: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
ecf0: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
ed00: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
ed10: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
ed20: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
ed30: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
ed40: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
ed50: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
ed60: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
ed70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
ed80: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
ed90: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
eda0: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
edb0: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
edc0: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
edd0: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
ede0: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
edf0: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
ee00: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
ee10: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
ee20: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
ee30: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
ee40: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
ee50: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
ee60: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
ee70: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
ee80: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
ee90: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
eea0: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
eeb0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
eec0: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
eed0: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
eee0: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
eef0: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
ef00: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  0];.      pBt->p
ef10: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
ef20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ef30: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ef40: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
ef50: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
ef60: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
ef70: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
ef80: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
ef90: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
efa0: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
efb0: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
efc0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
efd0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
efe0: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
eff0: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
f000: 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
f010: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
f020: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f030: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
f040: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
f050: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
f060: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
f070: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
f080: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
f090: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
f0a0: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
f0b0: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
f0c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
f0d0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
f0e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f0f0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
f100: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
f110: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
f120: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
f130: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
f140: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
f150: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
f160: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f170: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
f180: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
f190: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
f1a0: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
f1b0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
f1c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
f1d0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
f1e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
f1f0: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
f200: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
f210: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
f220: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
f230: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f240: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f250: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
f260: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
f270: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
f280: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f290: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
f2a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
f2b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
f2c0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f2d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2e0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f2f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
f300: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f310: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
f320: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f330: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f340: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
f350: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f360: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f370: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
f380: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f390: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
f3a0: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
f3b0: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
f3c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f3d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f3e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f3f0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f400: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
f410: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
f420: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
f430: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
f440: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
f450: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
f460: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
f470: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
f480: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
f490: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
f4a0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f4b0: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
f4c0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
f4d0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f4e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
f4f0: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
f500: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f520: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
f530: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
f540: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
f550: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
f560: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
f570: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
f580: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
f590: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
f5a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f5b0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
f5c0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
f5d0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
f5e0: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
f5f0: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
f600: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
f610: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
f620: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
f630: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
f640: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
f650: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
f660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f670: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
f680: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
f690: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
f6a0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
f6b0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
f6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
f6d0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
f6e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f6f0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
f700: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
f710: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
f720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f730: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
f740: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
f750: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
f760: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f770: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
f780: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
f790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
f7a0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
f7b0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
f7c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
f7d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
f7e0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
f7f0: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
f800: 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
f810: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
f820: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f830: 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
f840: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f850: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
f860: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f870: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
f880: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
f890: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
f8a0: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
f8b0: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
f8c0: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
f8d0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
f8e0: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
f8f0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
f900: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
f910: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
f920: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
f930: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
f940: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
f950: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
f960: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
f970: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
f980: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
f990: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f9a0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
f9b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
f9c0: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
f9d0: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
f9e0: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
f9f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fa00: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
fa10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
fa20: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
fa30: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fa40: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
fa50: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
fa60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
fa70: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
fa80: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
fa90: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
faa0: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
fab0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fac0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
fad0: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
fae0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
faf0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fb00: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
fb10: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
fb20: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
fb30: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fb40: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fb50: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
fb60: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
fb70: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
fb80: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
fb90: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
fba0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
fbb0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
fbc0: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
fbd0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
fbe0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
fbf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fc00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
fc10: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
fc20: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
fc30: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
fc40: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
fc50: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
fc60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
fc70: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
fc80: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
fc90: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
fca0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
fcb0: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
fcc0: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
fcd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
fce0: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
fcf0: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
fd00: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
fd10: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
fd20: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
fd30: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
fd40: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
fd50: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
fd60: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
fd70: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
fd80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
fd90: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
fda0: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
fdb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
fdc0: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
fdd0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
fde0: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
fdf0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
fe00: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
fe10: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
fe20: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
fe30: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
fe40: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
fe50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fe60: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
fe70: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
fe80: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
fe90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
fea0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
feb0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
fec0: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
fed0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
fee0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
fef0: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
ff00: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
ff10: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
ff20: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
ff30: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
ff40: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
ff50: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
ff60: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
ff70: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
ff80: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
ff90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
ffa0: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
ffb0: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
ffc0: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
ffd0: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
ffe0: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
fff0: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
10000 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
10010 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
10020 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
10030 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
10040 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
10050 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
10060 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
10070 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
10080 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10090 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
100a0 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
100b0 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
100c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
100d0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
100e0 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
100f0 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
10100 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
10110 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
10120 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
10130 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
10140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
10150 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
10160 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
10170 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
10180 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
10190 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
101a0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
101b0 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
101c0 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
101d0 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
101e0 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
101f0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
10200 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
10210 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
10220 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
10230 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
10240 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
10250 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
10260 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
10270 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
10280 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
10290 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
102a0 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
102b0 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
102c0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
102d0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
102e0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
102f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
10300 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
10310 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10320 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10330 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
10340 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10350 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10360 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
10370 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
10380 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
10390 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
103a0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
103b0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
103c0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
103d0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
103e0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
103f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
10400 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
10410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10430 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
10440 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10450 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
10460 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
10470 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10480 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
10490 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
104a0 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
104b0 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
104c0 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
104d0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
104e0 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
104f0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
10500 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
10510 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
10520 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
10530 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
10540 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
10550 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
10560 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
10570 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
10580 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10590 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
105a0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
105b0 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
105c0 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
105d0 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
105e0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
105f0 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
10600 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
10610 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
10620 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
10630 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
10640 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
10650 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
10660 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
10670 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
10680 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
10690 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
106a0 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
106b0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
106c0 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
106d0 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
106e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
106f0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
10700 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
10710 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
10720 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
10730 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10740 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10750 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10760 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10770 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10780 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
10790 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
107a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
107b0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
107c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
107d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
107e0 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
107f0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
10800 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
10810 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
10820 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
10830 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
10840 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
10850 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
10860 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
10870 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
10880 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
10890 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
108a0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
108b0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
108c0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
108d0 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
108e0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
108f0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
10900 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
10910 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
10920 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
10930 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
10940 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
10950 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
10960 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
10970 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
10980 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
10990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
109a0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
109b0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
109c0 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
109d0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c  (Btree *p, int l
109e0 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79  evel, int fullSy
109f0 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  nc){.  BtShared 
10a00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10a10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10a20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
10a30 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
10a40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10a50 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
10a60 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
10a70 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
10a80 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
10a90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10aa0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
10ac0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
10ad0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
10ae0 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
10af0 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
10b00 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
10b10 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
10b20 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
10b30 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
10b40 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
10b50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10b60 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
10b70 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
10b80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
10b90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
10ba0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10bb0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10bc0 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71  mutex) );  .  sq
10bd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10be0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
10bf0 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
10c00 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
10c10 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42  e3PagerNosync(pB
10c20 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71  t->pPager);.  sq
10c30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10c40 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
10c50 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
10c60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
10c70 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
10c80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10c90 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
10ca0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
10cb0 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
10cc0 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
10cd0 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
10ce0 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
10cf0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
10d00 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
10d10 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
10d20 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
10d30 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
10d40 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
10d50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10d60 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
10d70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
10d80 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
10d90 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
10da0 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
10db0 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
10dc0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
10dd0 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
10de0 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
10df0 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
10e00 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
10e10 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
10e20 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
10e30 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
10e40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
10e50 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
10e60 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
10e70 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
10e80 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
10e90 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
10ea0 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
10eb0 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
10ec0 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
10ed0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
10ee0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
10ef0 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
10f00 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
10f10 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
10f20 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
10f30 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
10f40 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
10f50 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
10f60 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
10f70 65 20 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  e pageSizeFixed 
10f80 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
10f90 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
10fa0 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
10fb0 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
10fc0 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
10fd0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10fe0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
10ff0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11000 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
11010 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
11020 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11030 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
11040 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11050 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
11060 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
11070 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11080 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11090 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
110a0 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29  >pageSizeFixed )
110b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
110c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
110d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
110e0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
110f0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
11100 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
11110 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
11120 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
11130 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
11140 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
11150 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11160 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
11170 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
11180 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11190 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
111a0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
111b0 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
111c0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
111d0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
111e0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
111f0 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
11200 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
11210 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
11220 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
11230 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
11240 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
11250 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11260 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11270 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
11280 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
11290 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
112a0 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
112b0 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
112c0 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
112d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
112e0 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  xed = 1;.  sqlit
112f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11310 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11320 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
11330 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
11340 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11350 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
11360 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
11370 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
11380 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
11390 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
113a0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
113b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
113c0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
113d0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
113e0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
113f0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
11400 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
11410 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
11420 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
11430 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
11440 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
11450 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
11460 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11470 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11480 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
11490 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
114a0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
114b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
114c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
114d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
114e0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
114f0 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
11500 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
11510 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
11520 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11530 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
11540 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
11550 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
11560 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
11570 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
11580 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
115a0 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
115b0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
115c0 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
115d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
115e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
115f0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
11600 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
11610 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
11620 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11630 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11640 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
11650 65 74 20 74 68 65 20 73 65 63 75 72 65 44 65 6c  et the secureDel
11660 65 74 65 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ete flag if newF
11670 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
11680 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
11690 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
116a0 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
116b0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
116c0 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 75 72  lue of the secur
116d0 65 44 65 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69  eDelete.** setti
116e0 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
116f0 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
11700 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
11710 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
11720 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
11730 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
11740 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
11750 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11760 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
11770 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
11780 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
11790 65 20 3d 20 28 6e 65 77 46 6c 61 67 21 3d 30 29  e = (newFlag!=0)
117a0 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20   ? 1 : 0;.  } . 
117b0 20 62 20 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63   b = p->pBt->sec
117c0 75 72 65 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c  ureDelete;.  sql
117d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
117e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
117f0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
11800 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11810 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
11820 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
11830 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
11840 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
11850 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
11860 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
11870 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
11880 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
11890 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
118a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
118b0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
118c0 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
118d0 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
118e0 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
118f0 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
11900 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
11910 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
11920 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
11930 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
11940 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
11950 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11960 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
11970 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
11980 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
11990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
119a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
119b0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
119c0 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
119d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
119e0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
119f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
11a00 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
11a10 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
11a20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11a30 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
11a40 65 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31  eFixed && (av ?1
11a50 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
11a60 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
11a70 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
11a80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11a90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
11aa0 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
11ab0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
11ac0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
11ad0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11ae0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11af0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
11b00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11b10 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
11b20 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
11b30 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
11b40 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
11b50 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
11b60 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
11b70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11b80 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
11b90 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
11ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11bb0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
11bc0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
11bd0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
11be0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
11bf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11c00 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
11c10 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
11c20 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
11c30 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
11c40 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
11c50 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
11c60 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
11c70 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
11c80 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
11c90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11ca0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11cb0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
11cc0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
11cd0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
11ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11cf0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
11d00 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
11d10 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
11d20 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
11d30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11d40 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
11d50 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
11d60 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
11d70 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
11d80 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
11d90 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
11da0 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
11db0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
11dc0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
11dd0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
11de0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
11df0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
11e00 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
11e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
11e20 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
11e30 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
11e40 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11e50 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  e1;.  int nPage;
11e60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11e70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11e80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11e90 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
11ea0 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
11eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
11ec0 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
11ed0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
11ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
11ef0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
11f00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
11f10 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
11f20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11f30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
11f40 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
11f50 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
11f60 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
11f70 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
11f80 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
11f90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11fa0 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
11fb0 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
11fc0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
11fd0 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
11fe0 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
11ff0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
12000 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
12010 67 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 67  ge))!=0 ){.    g
12020 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12030 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ailed;.  }else i
12040 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
12050 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a    int pageSize;.
12060 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
12070 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
12080 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
12090 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
120a0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
120b0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
120c0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
120d0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
120e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
120f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
12100 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
12110 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72   ){.      pBt->r
12120 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadOnly = 1;.   
12130 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
12140 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
12150 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12160 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
12170 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
12180 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
12190 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
121a0 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
121b0 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
121c0 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
121d0 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
121e0 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
121f0 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
12200 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
12210 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
12220 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
12230 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
12240 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
12250 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
12260 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
12270 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
12280 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
12290 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
122a0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
122b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
122c0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
122d0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
122e0 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
122f0 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b  yte(&page1[16]);
12300 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
12310 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
12320 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c  !=0 || pageSize<
12330 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  512 ||.        (
12340 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
12350 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61  SIZE<32768 && pa
12360 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
12370 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20  X_PAGE_SIZE).   
12380 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12390 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
123a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
123b0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
123c0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
123d0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
123e0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
123f0 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
12400 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
12410 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
12420 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
12430 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
12440 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
12450 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
12460 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
12470 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
12480 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
12490 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
124a0 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
124b0 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
124c0 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
124d0 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
124e0 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
124f0 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
12500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
12510 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
12520 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
12530 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
12540 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
12550 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
12560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
12570 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
12580 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
12590 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
125a0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
125b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
125c0 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
125d0 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
125e0 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
125f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12600 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
12610 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
12620 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
12650 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
12660 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12670 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
12680 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
12690 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
126a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
126b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
126c0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
126d0 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70  )pageSize;.    p
126e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
126f0 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
12700 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12710 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12720 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
12730 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
12740 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
12750 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
12760 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
12770 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
12780 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
12790 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
127a0 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
127b0 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
127c0 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
127d0 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
127e0 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
127f0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
12800 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
12810 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
12820 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
12830 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
12840 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
12850 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
12860 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
12870 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
12880 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
12890 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
128a0 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
128b0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
128c0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
128d0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
128e0 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
128f0 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
12900 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
12910 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
12920 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
12930 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
12940 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
12950 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
12960 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
12970 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
12980 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
12990 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
129a0 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
129b0 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
129c0 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
129d0 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
129e0 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
129f0 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
12a00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12a10 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *64/255 - 23;.  
12a20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
12a30 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
12a40 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
12a50 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
12a60 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
12a70 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
12a80 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
12a90 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
12aa0 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73  2/255 - 23;.  as
12ab0 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
12ac0 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
12ad0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
12ae0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
12af0 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
12b00 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
12b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12b20 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
12b30 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
12b40 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
12b50 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
12b60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12b70 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
12b80 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
12b90 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
12ba0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
12bb0 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
12bc0 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
12bd0 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
12be0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
12bf0 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
12c00 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
12c10 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
12c20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12c30 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
12c40 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
12c50 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
12c60 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
12c70 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
12c80 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
12c90 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
12ca0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
12cb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
12cc0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
12cd0 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
12ce0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12cf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12d00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12d10 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
12d20 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d  ursor==0 || pBt-
12d30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
12d40 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
12d50 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
12d60 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
12d70 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
12d80 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
12d90 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
12da0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
12db0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12dc0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
12dd0 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
12de0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
12df0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
12e00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
12e10 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
12e20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
12e30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
12e40 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
12e50 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
12e60 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
12e70 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
12e80 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
12e90 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
12ea0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
12eb0 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
12ec0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
12ed0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
12ee0 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
12ef0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
12f00 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
12f10 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
12f20 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
12f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12f40 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12f50 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
12f60 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
12f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12f80 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
12f90 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
12fa0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
12fb0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
12fc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12fd0 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
12fe0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
12ff0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13000 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
13010 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
13020 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
13030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
13040 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
13050 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
13060 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
13070 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
13080 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
13090 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
130a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
130b0 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
130c0 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
130d0 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
130e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
130f0 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
13100 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
13110 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
13120 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
13130 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
13140 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
13150 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
13160 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
13170 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
13180 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
13190 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
131a0 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
131b0 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
131c0 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
131d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
131e0 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
131f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
13200 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
13210 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
13220 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
13230 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
13240 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
13250 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
13260 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
13270 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
13280 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
13290 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
132a0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
132b0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
132c0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
132d0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
132e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
132f0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
13300 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
13310 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
13320 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
13330 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
13340 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
13350 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
13360 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
13370 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
13380 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13390 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
133a0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
133b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
133c0 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
133d0 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
133e0 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
133f0 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
13400 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
13410 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
13420 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
13430 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
13440 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
13450 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
13460 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
13470 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
13480 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
13490 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
134a0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
134b0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
134c0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
134d0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
134e0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
134f0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
13500 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
13510 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
13520 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
13530 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
13540 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
13550 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
13560 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
13570 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
13580 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
13590 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
135a0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
135b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
135c0 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
135d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
135e0 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
135f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
13600 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
13610 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
13620 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
13630 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
13640 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
13650 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
13660 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
13670 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
13680 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
13690 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
136a0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
136b0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
136c0 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
136d0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
136e0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
136f0 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
13700 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
13710 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
13720 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
13730 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
13740 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
13750 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
13760 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
13770 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
13780 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
13790 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
137a0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
137b0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
137c0 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
137d0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
137e0 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
137f0 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
13800 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
13810 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
13820 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
13830 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
13840 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
13850 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
13860 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
13870 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
13880 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
13890 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
138a0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
138b0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
138c0 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
138d0 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
138e0 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
138f0 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
13900 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
13910 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
13920 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
13930 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
13940 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
13950 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
13960 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
13970 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
13980 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13990 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
139a0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
139b0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
139c0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
139d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
139e0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
139f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13a00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13a10 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
13a20 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
13a30 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
13a40 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
13a50 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
13a60 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
13a70 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
13a80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
13a90 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
13aa0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
13ab0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
13ac0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
13ad0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13ae0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
13af0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
13b00 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
13b10 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
13b20 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
13b30 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
13b40 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
13b50 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
13b60 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
13b70 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
13b80 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
13b90 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
13ba0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13bb0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13bc0 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
13bd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13be0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
13bf0 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
13c00 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
13c10 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
13c20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13c30 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
13c40 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
13c50 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
13c60 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
13c70 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
13c80 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
13c90 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
13ca0 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
13cb0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
13cc0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
13cd0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
13ce0 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
13cf0 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
13d00 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
13d10 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
13d20 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
13d30 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
13d40 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
13d50 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
13d60 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
13d70 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
13d80 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
13d90 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
13da0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
13db0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13dc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13dd0 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
13de0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
13df0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
13e00 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
13e10 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
13e20 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
13e30 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13e40 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
13e50 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
13e60 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
13e70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
13e80 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
13e90 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
13ea0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
13eb0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
13ec0 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
13ed0 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
13ee0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
13ef0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
13f00 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
13f10 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
13f20 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
13f30 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
13f40 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
13f50 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
13f60 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
13f70 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 64  rans_begun;..  d
13f80 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
13f90 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
13fa0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
13fb0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
13fc0 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
13fd0 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
13fe0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
13ff0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
14000 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
14010 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
14020 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
14030 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
14040 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
14050 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
14060 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
14070 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
14080 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
14090 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
140a0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
140b0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
140c0 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
140d0 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
140e0 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
140f0 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
14100 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
14110 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
14120 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
14130 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
14140 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
14150 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
14160 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
14170 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
14180 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
14190 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
141a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
141b0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
141c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
141d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
141e0 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
141f0 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
14200 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
14210 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
14220 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14240 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
14250 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
14260 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14270 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
14280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14290 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
142a0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
142b0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
142c0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
142d0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
142e0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
142f0 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
14300 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
14310 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
14320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14330 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
14340 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
14350 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
14360 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
14370 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14380 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14390 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
143a0 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65  harable ){..asse
143b0 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
143c0 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
143d0 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
143e0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
143f0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
14400 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
14410 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
14420 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
14430 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
14440 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
14450 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
14460 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
14470 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
14480 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
14490 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
144a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
144b0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
144c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
144d0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
144e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
144f0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14500 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
14510 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14520 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
14530 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
14540 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
14550 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
14560 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e  e = (u8)(wrflag>
14570 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
14580 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
14590 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
145a0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
145b0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
145c0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
145d0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
145e0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
145f0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
14600 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
14610 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
14620 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
14630 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
14640 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
14650 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
14660 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
14670 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
14680 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
14690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
146a0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
146b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
146c0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
146d0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
146e0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
146f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14700 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14710 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
14720 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14730 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
14740 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
14750 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
14760 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
14770 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
14780 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
14790 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
147a0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
147b0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
147c0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
147d0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
147e0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
147f0 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
14800 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
14810 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
14820 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
14850 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
14860 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14890 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
148a0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
148b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
148d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
148e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
148f0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
14900 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14910 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
14920 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
14930 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
14940 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14950 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14960 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14970 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
14980 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
14990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
149a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
149b0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
149c0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
149d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
149e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
149f0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
14a00 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
14a10 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
14a20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
14a30 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
14a40 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
14a50 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
14a60 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
14a70 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
14a80 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
14a90 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
14aa0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
14ab0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
14ac0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14ad0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
14ae0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
14af0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
14b00 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
14b10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
14b20 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
14b30 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
14b40 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
14b50 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
14b60 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
14b70 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
14b80 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
14b90 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
14ba0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
14bb0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
14bc0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
14bd0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
14be0 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
14bf0 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
14c00 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
14c10 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
14c20 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
14c30 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
14c40 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
14c50 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
14c60 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
14c70 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
14c80 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
14c90 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
14ca0 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
14cd0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
14ce0 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
14cf0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
14d00 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
14d10 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
14d20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14d30 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
14d40 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
14d50 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
14d60 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
14d70 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
14d80 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
14d90 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
14da0 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
14db0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
14dc0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
14dd0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
14de0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
14df0 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
14e00 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
14e10 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
14e20 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
14e30 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
14e40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14e50 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
14e60 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14e70 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
14e80 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
14e90 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
14ea0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
14eb0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
14ec0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
14ed0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
14ee0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
14ef0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
14f00 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
14f10 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
14f20 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
14f30 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
14f40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14f50 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
14f60 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
14f70 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
14f80 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
14f90 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
14fa0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
14fb0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
14fc0 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
14fd0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
14fe0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
14ff0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
15000 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
15010 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
15020 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
15030 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
15040 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
15050 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
15060 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
15070 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
15080 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
15090 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
150a0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
150b0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
150c0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
150d0 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
150e0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
150f0 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
15100 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
15110 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
15120 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
15130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
15140 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
15150 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15170 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
15180 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
15190 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
151a0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
151b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
151c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
151d0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
151e0 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
151f0 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
15200 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
15210 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
15220 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
15230 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
15240 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
15250 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15260 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
15270 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
15280 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
15290 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
152a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
152b0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
152c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
152d0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
152e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
152f0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
15300 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
15310 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
15320 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
15330 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
15340 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
15350 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
15360 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
15370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
15380 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
15390 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
153a0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
153b0 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
153c0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
153d0 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
153e0 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
153f0 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
15400 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
15410 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
15420 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
15430 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
15440 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
15450 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
15460 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
15470 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
15480 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
15490 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
154a0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
154b0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
154c0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
154d0 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
154e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
154f0 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
15500 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15510 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
15520 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
15530 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
15540 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
15550 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
15560 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
15570 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
15580 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
15590 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
155a0 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
155b0 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
155c0 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
155d0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
155e0 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
155f0 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
15600 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
15610 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
15620 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
15630 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
15640 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
15650 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
15660 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
15670 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
15680 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
15690 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
156a0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
156b0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
156c0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
156d0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
156e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
156f0 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
15700 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15710 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
15730 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
15740 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
15750 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
15760 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
15770 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
15780 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
15790 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
157a0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
157b0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
157c0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
157d0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
157e0 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
157f0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
15800 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
15810 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
15820 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
15830 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
15840 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
15850 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
15860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15870 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
15880 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
15890 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
158a0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
158b0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
158c0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
158d0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
158e0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
158f0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
15900 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
15910 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15920 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
15930 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
15940 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
15950 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
15960 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
15970 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
15980 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15990 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
159a0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
159b0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
159c0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
159d0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
159e0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
159f0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
15a00 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
15a10 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
15a20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
15a30 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
15a40 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
15a50 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
15a60 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
15a70 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
15a80 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
15a90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15aa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15ab0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
15ad0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
15ae0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
15af0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
15b00 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
15b10 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15b20 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
15b30 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
15b40 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
15b50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15b60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15b80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15b90 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
15ba0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
15bb0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
15bc0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
15bd0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
15be0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
15bf0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
15c00 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
15c10 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
15c20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
15c30 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
15c40 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
15c50 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
15c60 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
15c70 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
15c80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15c90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15ca0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15cb0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
15cc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
15cd0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
15ce0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15d00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15d10 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
15d20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15d30 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
15d40 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
15d50 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
15d60 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
15d70 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
15d80 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
15d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15da0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
15db0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
15dc0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
15dd0 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
15de0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15df0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
15e00 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
15e10 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
15e20 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
15e30 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
15e40 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
15e50 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
15e60 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
15e70 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
15e80 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
15e90 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
15ea0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
15eb0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
15ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15ed0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
15ee0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
15ef0 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
15f00 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
15f10 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
15f20 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
15f30 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
15f40 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
15f50 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
15f60 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
15f70 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
15f80 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
15f90 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
15fa0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
15fb0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
15fc0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
15fd0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
15fe0 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
15ff0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
16000 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
16010 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
16020 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
16030 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
16040 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
16050 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
16060 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
16070 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
16080 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
16090 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
160a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
160b0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
160c0 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
160d0 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
160e0 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
160f0 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
16100 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
16110 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
16120 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
16130 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
16140 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
16150 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
16160 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
16170 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
16180 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
16190 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
161a0 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
161b0 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
161c0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
161d0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
161e0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
161f0 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
16200 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
16210 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
16220 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16230 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
16240 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
16250 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16260 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16270 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
16290 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
162a0 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
162b0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
162c0 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
162d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
162e0 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
162f0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
16300 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
16310 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
16320 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
16330 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
16340 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
16350 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
16360 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16370 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
16380 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
16390 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
163a0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
163b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
163c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
163d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
163e0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
163f0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
16400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16410 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
16420 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
16430 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
16440 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
16450 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
16460 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
16470 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
16480 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
16490 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
164a0 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
164b0 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
164c0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
164d0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
164e0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
164f0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
16500 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
16510 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
16520 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
16530 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
16540 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
16550 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
16560 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
16570 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16580 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
16590 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
165a0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
165b0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
165c0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
165d0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
165e0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
165f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16620 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
16630 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
16640 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
16650 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
16660 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
16670 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
16680 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
16690 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
166a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
166b0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
166c0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
166d0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
166e0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
166f0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
16700 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
16710 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
16720 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16730 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16740 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16750 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
16760 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
16770 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
16780 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
16790 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
167a0 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
167b0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
167c0 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
167d0 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
167e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
167f0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
16800 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
16810 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
16820 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
16830 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
16840 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
16850 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
16860 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
16870 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
16880 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
16890 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
168a0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
168b0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
168c0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
168d0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
168e0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
168f0 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
16900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16920 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
16930 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
16940 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16950 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
16960 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16970 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
16980 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
16990 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
169a0 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
169b0 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
169c0 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
169d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
169e0 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
169f0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
16a00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16a20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
16a30 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
16a40 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
16a50 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d   iFreePg, nFin!=
16a60 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
16a70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
16a80 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
16a90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16aa0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
16ab0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
16ac0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
16ad0 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  Fin==0 ){.    iL
16ae0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69  astPg--;.    whi
16af0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
16b00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
16b10 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41  Bt)||PTRMAP_ISPA
16b20 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
16b30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54   ){.      if( PT
16b40 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16b50 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
16b60 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
16b70 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
16b80 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
16b90 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c  , iLastPg, &pPg,
16ba0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
16bd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
16be0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16bf0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
16c00 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
16c10 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
16c20 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
16c30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16c40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16c50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16c60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16c70 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
16c80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
16c90 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
16ca0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  e(pBt->pPager, i
16cb0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74  LastPg);.    pBt
16cc0 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
16cd0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
16ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16cf0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
16d00 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
16d10 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
16d20 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
16d30 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
16d40 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
16d50 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
16d60 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
16d70 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
16d80 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
16d90 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
16da0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
16db0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
16dc0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
16dd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
16de0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
16df0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
16e00 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
16e10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16e20 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
16e30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
16e40 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
16e50 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
16e60 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
16e70 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
16e80 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
16e90 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
16ea0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
16eb0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
16ec0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
16ed0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
16ee0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
16ef0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
16f00 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
16f10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
16f20 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
16f30 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
16f40 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
16f50 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
16f60 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
16f70 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  0, pagerPagecoun
16f80 74 28 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28  t(pBt));.    if(
16f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16fa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
16fb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
16fc0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
16fd0 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
16fe0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16ff0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
17000 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
17010 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17020 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17030 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17040 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17050 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
17060 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
17070 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
17080 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
17090 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
170a0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
170b0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
170c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
170d0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
170e0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
170f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
17100 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17110 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
17120 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
17130 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
17140 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
17150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
17160 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
17170 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
17180 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
17190 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
171a0 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
171b0 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
171c0 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
171d0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
171e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
171f0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
17200 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
17210 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
17220 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
17230 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
17240 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
17250 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17260 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17270 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
17280 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
17290 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
172a0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
172b0 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
172c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
172d0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
172e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
172f0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
17300 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
17310 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
17320 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
17330 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
17340 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
17350 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
17360 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
17370 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17380 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
17390 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
173a0 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
173b0 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
173c0 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
173d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72  */.    int nEntr
173e0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  y;        /* Num
173f0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
17400 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
17410 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  e */.    Pgno nO
17420 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
17430 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
17440 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
17450 20 20 20 20 6e 4f 72 69 67 20 3d 20 70 61 67 65      nOrig = page
17460 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
17470 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
17480 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
17490 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
174a0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
174b0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
174c0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
174d0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
174e0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
174f0 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
17500 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
17510 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
17520 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
17530 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
17540 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
17550 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
17560 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
17570 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
17580 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
17590 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
175a0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
175b0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
175c0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
175d0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
175e0 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
175f0 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20  sableSize/5;.   
17600 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
17610 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
17620 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
17630 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
17640 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ;.    nFin = nOr
17650 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
17660 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f  rmap;.    if( nO
17670 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
17680 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
17690 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
176a0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
176b0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
176c0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
176d0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
176e0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
176f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
17700 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
17710 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
17720 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
17730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17740 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
17750 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
17760 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
17770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
17780 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
17790 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
177a0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
177b0 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
177c0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
177d0 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
177e0 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
177f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
17800 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17810 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
17820 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17830 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
17840 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
17850 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
17860 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
17870 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
17880 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
17890 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
178a0 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
178b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
178c0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
178d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46  (pBt->pPager, nF
178e0 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
178f0 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
17900 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
17910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17920 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
17930 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
17940 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
17950 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
17960 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
17970 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
17980 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
17990 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
179a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
179b0 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
179c0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
179d0 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
179e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
179f0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
17a00 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
17a10 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
17a20 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
17a30 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
17a40 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
17a50 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
17a60 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
17a70 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
17a80 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
17a90 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
17aa0 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
17ab0 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
17ac0 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
17ad0 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
17ae0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
17af0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
17b00 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
17b10 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
17b20 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17b30 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
17b40 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
17b50 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
17b60 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
17b70 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
17b80 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
17b90 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
17ba0 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
17bb0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17bc0 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
17bd0 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
17be0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
17bf0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
17c00 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
17c10 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
17c20 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
17c30 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
17c40 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
17c50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
17c60 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
17c70 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
17c80 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
17c90 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
17ca0 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
17cb0 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
17cc0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
17cd0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
17ce0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
17cf0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
17d00 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
17d10 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
17d20 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
17d30 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
17d40 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
17d50 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
17d60 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
17d70 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
17d80 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
17d90 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
17da0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
17db0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
17dc0 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
17dd0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
17de0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17df0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
17e00 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
17e10 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
17e20 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
17e30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17e40 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
17e50 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
17e60 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
17e70 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
17e80 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
17e90 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
17ea0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
17eb0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
17ec0 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
17ed0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
17ee0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
17ef0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17f00 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
17f10 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
17f20 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
17f30 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
17f40 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
17f50 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
17f60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
17f70 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
17f80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
17f90 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
17fa0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
17fb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17fc0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
17fd0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17fe0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17ff0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18000 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
18010 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
18020 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
18030 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
18040 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18060 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18070 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
18080 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18090 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
180a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
180b0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
180c0 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
180d0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
180e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
180f0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
18100 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
18120 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
18130 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
18140 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
18150 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
18160 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
18170 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
18180 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
18190 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
181a0 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
181b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
181c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
181d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
181e0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
181f0 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72  );..  btreeClear
18200 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
18210 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
18220 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
18230 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62  p->db->activeVdb
18240 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  eCnt>1 ){.    /*
18250 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
18260 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
18270 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
18280 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
18290 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
182a0 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
182b0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
182c0 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
182d0 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
182e0 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
182f0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
18300 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
18310 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
18320 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
18330 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
18340 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
18350 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
18360 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
18370 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
18380 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
18390 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
183a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
183b0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
183c0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
183d0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
183e0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
183f0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
18400 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
18410 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
18420 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
18430 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
18440 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
18450 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
18460 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
18470 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
18480 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
18490 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
184a0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
184b0 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
184c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
184d0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
184e0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
184f0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
18500 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
18510 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
18520 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
18530 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
18540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
18550 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
18560 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
18570 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
18580 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
18590 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
185a0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
185b0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
185c0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
185d0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
185e0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
185f0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
18600 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
18610 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
18620 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18630 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
18640 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
18650 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
18660 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
18670 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
18680 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
18690 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
186a0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
186b0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
186c0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
186d0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
186e0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
186f0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
18700 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
18710 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18720 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
18730 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
18740 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
18750 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
18760 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
18770 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
18780 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
18790 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
187a0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
187b0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
187c0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
187d0 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
187e0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
187f0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
18800 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
18810 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
18820 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
18830 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
18840 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
18850 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
18860 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
18870 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
18880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18890 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
188a0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
188b0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
188c0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
188d0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
188e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
188f0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
18900 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
18910 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
18920 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18930 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
18940 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
18950 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
18960 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
18970 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
18980 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
18990 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
189a0 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
189b0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
189c0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
189d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
189e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
189f0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
18a00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
18a10 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18a20 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
18a30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
18a40 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
18a50 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
18a60 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
18a70 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
18a80 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
18a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18aa0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
18ab0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
18ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18ad0 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
18ae0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
18af0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
18b00 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
18b10 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
18b20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
18b50 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
18b60 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
18b70 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
18b80 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
18b90 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
18ba0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18bb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18bc0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
18bd0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
18be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18c00 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
18c10 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  o(p);.  }.  sqli
18c20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18c40 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
18c50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18c60 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
18c70 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
18c80 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
18c90 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
18ca0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
18cb0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
18cc0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
18cd0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
18ce0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
18cf0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
18d00 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
18d10 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
18d20 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
18d30 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
18d40 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
18d50 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
18d60 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
18d70 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
18d80 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
18d90 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
18da0 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
18db0 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
18dc0 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
18dd0 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
18de0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
18df0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
18e00 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
18e10 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
18e20 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
18e30 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
18e40 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
18e50 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
18e60 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
18e70 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
18e80 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
18e90 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
18ea0 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
18eb0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
18ec0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
18ed0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
18ee0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
18ef0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
18f00 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
18f10 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
18f20 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
18f30 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
18f40 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
18f50 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
18f60 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
18f70 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
18f80 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
18f90 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
18fa0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
18fb0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
18fc0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
18fd0 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
18fe0 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
18ff0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
19000 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
19010 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
19020 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
19030 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
19040 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
19050 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
19060 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
19070 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
19080 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
19090 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
190a0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
190b0 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
190c0 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
190d0 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
190e0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
190f0 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
19100 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
19110 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
19120 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
19130 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
19140 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
19150 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
19160 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
19170 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
19180 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
19190 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
191a0 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
191b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
191c0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
191d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
191e0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
191f0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
19200 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
19210 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
19220 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
19230 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19240 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
19250 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
19260 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
19270 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
19280 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
19290 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
192a0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
192b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
192c0 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
192d0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
192e0 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
192f0 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
19300 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
19310 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
19320 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
19330 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
19340 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
19350 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
19360 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
19370 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
19380 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
19390 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
193a0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
193b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
193c0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
193d0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
193e0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
193f0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
19400 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
19410 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
19420 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19430 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
19440 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19450 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19460 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
19470 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
19480 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
19490 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
194a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
194b0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
194c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
194d0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
194e0 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
194f0 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
19500 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
19510 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  r occurred whils
19520 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
19530 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
19540 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
19550 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
19560 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
19570 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
19580 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
19590 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
195a0 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
195b0 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
195c0 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
195d0 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
195e0 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
195f0 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
19600 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
19610 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
19620 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
19630 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
19640 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
19650 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
19660 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
19670 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
19680 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
19690 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
196a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
196b0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
196c0 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   rc);.  }.#endif
196d0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
196e0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
196f0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
19700 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
19710 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
19720 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
19730 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19740 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
19750 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
19760 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
19770 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
19780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19790 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
197a0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
197b0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
197c0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
197d0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
197e0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
197f0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
19800 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
19810 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
19820 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
19830 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
19840 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
19850 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
19860 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
19870 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
19880 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19890 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
198a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
198b0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70  ntWriteCursors(p
198c0 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42  Bt)==0 );.    pB
198d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
198e0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
198f0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
19900 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
19910 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19920 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19930 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
19940 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
19950 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
19960 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
19970 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c   can can be roll
19980 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
19990 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
199a0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
199b0 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
199c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
199d0 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
199e0 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
199f0 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
19a00 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
19a10 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
19a20 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
19a30 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
19a40 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
19a50 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
19a60 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
19a70 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
19a80 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
19a90 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
19aa0 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
19ab0 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
19ac0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
19ad0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
19ae0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
19af0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
19b00 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
19b10 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
19b20 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
19b30 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
19b40 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
19b50 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
19b60 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
19b70 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
19b80 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
19b90 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
19ba0 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
19bb0 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
19bc0 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
19bd0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
19be0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
19bf0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
19c00 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
19c10 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
19c20 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
19c30 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
19c40 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
19c50 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
19c60 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
19c70 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
19c80 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
19c90 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
19ca0 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
19cb0 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
19cc0 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
19cd0 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
19ce0 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
19cf0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
19d00 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
19d10 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
19d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
19d30 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
19d40 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
19d50 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
19d60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19d70 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
19d80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19d90 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
19da0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
19db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
19dc0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
19dd0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
19de0 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
19df0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
19e00 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
19e10 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  t );.  if( NEVER
19e20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  (p->inTrans!=TRA
19e30 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74 2d  NS_WRITE || pBt-
19e40 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
19e50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
19e60 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b  TERNAL;.  }else{
19e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
19e80 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
19e90 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
19ea0 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61      /* At the pa
19eb0 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
19ec0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
19ed0 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
19ee0 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e  t with.    ** an
19ef0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
19f00 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
19f10 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
19f20 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20 20  citly using.    
19f30 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
19f40 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
19f50 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
19f60 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
19f70 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73 61  y.    ** such sa
19f80 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
19f90 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
19fa0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
19fb0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
19fc0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
19fd0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
19fe0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
19ff0 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
1a000 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
1a010 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a020 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a030 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1a040 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1a050 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1a060 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1a070 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1a080 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1a090 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1a0a0 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1a0b0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1a0c0 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1a0d0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1a0e0 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1a0f0 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1a100 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1a110 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1a120 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1a130 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1a140 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1a150 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1a160 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1a170 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1a180 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1a190 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1a1a0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1a1b0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1a1c0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1a1d0 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1a1e0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1a1f0 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1a200 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1a210 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1a220 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1a230 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1a240 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1a250 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1a260 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a270 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1a280 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1a290 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1a2a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a2b0 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1a2c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a2d0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1a2e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a2f0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1a300 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1a310 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1a320 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1a330 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a340 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1a350 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1a360 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1a370 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1a380 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1a390 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1a3a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1a3b0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1a3c0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1a3d0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1a3e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a3f0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1a400 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1a410 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1a420 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1a430 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1a440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1a450 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a460 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a470 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
1a480 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
1a490 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
1a4a0 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
1a4b0 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
1a4c0 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c  e. If a read-onl
1a4d0 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  y cursor is requ
1a4e0 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73  ested, it is ass
1a4f0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
1a500 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20   caller already 
1a510 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72  has at least a r
1a520 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1a530 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20  tion open.** on 
1a540 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72  the database alr
1a550 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65  eady. If a write
1a560 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65  -cursor is reque
1a570 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sted, then.** th
1a580 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75  e caller is assu
1a590 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f  med to have an o
1a5a0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
1a5b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1a5c0 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
1a5d0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
1a5e0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
1a5f0 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
1a600 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
1a610 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
1a620 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1a630 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
1a640 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
1a650 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
1a660 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
1a670 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
1a680 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
1a690 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
1a6a0 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
1a6b0 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
1a6c0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
1a6d0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1a6e0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1a6f0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
1a700 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
1a710 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1a720 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
1a730 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
1a740 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
1a750 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
1a760 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
1a770 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
1a780 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
1a790 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
1a7a0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
1a7b0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
1a7c0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
1a7d0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
1a7e0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
1a7f0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
1a800 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
1a810 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
1a820 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
1a830 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1a840 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
1a850 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
1a860 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
1a870 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
1a880 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
1a890 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1a8a0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
1a8b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
1a8c0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
1a8d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1a8e0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
1a8f0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
1a900 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
1a910 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
1a920 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
1a930 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
1a940 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
1a950 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
1a960 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1a970 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
1a980 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
1a990 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
1a9a0 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
1a9b0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
1a9c0 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
1a9d0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
1a9e0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
1a9f0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
1aa00 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa30 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1aa40 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
1aa70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
1aa80 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
1aa90 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
1aac0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
1aad0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
1aae0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1aaf0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1ab00 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
1ab10 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
1ab20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab40 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
1ab50 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
1ab60 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
1ab70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab90 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
1aba0 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  handle */..  ass
1abb0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1abc0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1abd0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1abe0 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
1abf0 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =1 );..  /* The 
1ac00 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1ac10 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
1ac20 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
1ac30 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
1ac40 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
1ac50 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
1ac60 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
1ac70 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1ac80 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
1ac90 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
1aca0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
1acb0 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
1acc0 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
1acd0 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
1ace0 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
1acf0 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
1ad00 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
1ad10 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
1ad20 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a  0, wrFlag+1) );.
1ad30 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1ad40 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
1ad50 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
1ad60 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
1ad70 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
1ad80 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
1ad90 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
1ada0 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
1adb0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
1adc0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
1add0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1ade0 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
1adf0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1ae00 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1ae10 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
1ae20 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1ae30 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46  .  if( NEVER(wrF
1ae40 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64  lag && pBt->read
1ae50 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74  Only) ){.    ret
1ae60 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
1ae70 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  NLY;.  }.  if( i
1ae80 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65  Table==1 && page
1ae90 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  rPagecount(pBt)=
1aea0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1aeb0 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
1aec0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
1aed0 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
1aee0 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
1aef0 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
1af00 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
1af10 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
1af20 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
1af30 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
1af40 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
1af50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
1af60 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
1af70 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
1af80 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
1af90 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1afa0 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
1afb0 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
1afc0 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c  Bt;.  pCur->wrFl
1afd0 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b  ag = (u8)wrFlag;
1afe0 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
1aff0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
1b000 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1b010 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
1b020 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1b030 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
1b040 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
1b050 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1b060 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1b070 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1b080 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  id = 0;.  return
1b090 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
1b0a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1b0b0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1b0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
1b0f0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1b100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b120 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1b130 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1b140 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
1b180 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
1b190 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
1b1a0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1c0 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
1b1d0 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
1b1e0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1b210 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
1b220 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1b230 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b240 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1b250 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
1b260 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
1b270 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
1b280 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b290 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b2a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b2b0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1b2c0 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
1b2d0 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
1b2e0 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
1b2f0 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
1b300 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
1b310 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
1b320 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
1b330 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
1b340 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
1b350 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
1b360 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
1b370 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
1b380 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
1b390 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
1b3a0 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
1b3b0 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
1b3c0 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
1b3d0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
1b3e0 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
1b3f0 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
1b400 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
1b410 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1b420 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
1b430 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
1b440 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
1b450 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
1b460 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
1b470 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
1b480 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
1b490 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
1b4a0 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
1b4b0 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
1b4c0 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
1b4d0 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
1b4e0 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
1b4f0 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
1b500 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
1b510 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
1b520 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
1b530 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
1b540 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1b550 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
1b560 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
1b570 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1b580 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
1b590 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
1b5a0 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
1b5b0 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d  rsor, iPage));.}
1b5c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1b5d0 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c  cached rowid val
1b5e0 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73  ue of every curs
1b5f0 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  or in the same d
1b600 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1b610 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69  as pCur and havi
1b620 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ng the same root
1b630 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20   page number as 
1b640 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65  pCur.  The value
1b650 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52   is.** set to iR
1b660 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  owid..**.** Only
1b670 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20   positive rowid 
1b680 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1b690 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20  dered valid for 
1b6a0 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54  this cache..** T
1b6b0 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74  he cache is init
1b6c0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c  ialized to zero,
1b6d0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
1b6e0 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a  nvalid cache..**
1b6f0 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f   A btree will wo
1b700 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72  rk fine with zer
1b710 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
1b720 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63  wids.  We just c
1b730 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a  annot.** cache z
1b740 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20  ero or negative 
1b750 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65  rowids, which me
1b760 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20  ans tables that 
1b770 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e  use zero or.** n
1b780 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d  egative rowids m
1b790 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
1b7a0 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69  e slower.  But i
1b7b0 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f  n practice, zero
1b7c0 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20  .** or negative 
1b7d0 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20  rowids are very 
1b7e0 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73  uncommon so this
1b7f0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
1b800 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
1b810 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  d sqlite3BtreeSe
1b820 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
1b830 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c  ursor *pCur, sql
1b840 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
1b850 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  d){.  BtCursor *
1b860 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d  p;.  for(p=pCur-
1b870 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1b880 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1b890 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
1b8a0 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ot==pCur->pgnoRo
1b8b0 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f  ot ) p->cachedRo
1b8c0 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
1b8d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1b8e0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69  ->cachedRowid==i
1b8f0 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rowid );.}../*.*
1b900 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63  * Return the cac
1b910 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68  hed rowid for th
1b920 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20  e given cursor. 
1b930 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a   A negative or z
1b940 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  ero.** return va
1b950 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  lue indicates th
1b960 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  at the rowid cac
1b970 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e  he is invalid an
1b980 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  d should be.** i
1b990 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20  gnored.  If the 
1b9a0 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20  rowid cache has 
1b9b0 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1b9c0 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a  n set, then a.**
1b9d0 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
1b9e0 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  d..*/.sqlite3_in
1b9f0 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  t64 sqlite3Btree
1ba00 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42  GetCachedRowid(B
1ba10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ba20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63    return pCur->c
1ba30 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  achedRowid;.}../
1ba40 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
1ba50 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
1ba60 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1ba70 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
1ba80 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
1ba90 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
1baa0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
1bab0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
1bac0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
1bad0 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
1bae0 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
1baf0 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
1bb00 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
1bb10 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
1bb20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1bb30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1bb40 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1bb50 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1bb60 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1bb70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r);.    if( pCur
1bb80 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
1bb90 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
1bba0 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
1bbb0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
1bbc0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
1bbd0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1bbe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
1bbf0 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1bc00 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
1bc10 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50  pPrev = pCur->pP
1bc20 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  rev;.    }.    f
1bc30 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
1bc40 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1bc50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1bc60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
1bc70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
1bc80 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1bc90 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69  pBt);.    invali
1bca0 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1bcb0 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20  e(pCur);.    /* 
1bcc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
1bcd0 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
1bce0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1bcf0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
1bd00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1bd10 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1bd20 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
1bd30 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
1bd40 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
1bd50 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1bd60 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
1bd70 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1bd80 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
1bd90 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
1bda0 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
1bdb0 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
1bdc0 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
1bdd0 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
1bde0 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
1bdf0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
1be00 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
1be10 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
1be20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
1be30 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a  eParseCell()..**
1be40 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20  .** 2007-06-25: 
1be50 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20   There is a bug 
1be60 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  in some versions
1be70 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61   of MSVC that ca
1be80 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  use the.** compi
1be90 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65  ler to crash whe
1bea0 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20  n getCellInfo() 
1beb0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1bec0 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75  s a macro..** Bu
1bed0 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61  t there is a mea
1bee0 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61  sureable speed a
1bef0 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
1bf00 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67  g the macro on g
1bf10 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73  cc.** (when less
1bf20 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
1bf30 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73  zations like -Os
1bf40 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64   or -O0 are used
1bf50 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70   and the.** comp
1bf60 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e  iler is not doin
1bf70 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69  g agressive inli
1bf80 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73  ning.)  So we us
1bf90 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
1bfa0 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e  n.** for MSVC an
1bfb0 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76  d a macro for ev
1bfc0 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20  erything else.  
1bfd0 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f  Ticket #2457..*/
1bfe0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1bff0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
1c000 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
1c010 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1c020 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1c030 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1c040 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1c050 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
1c060 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
1c070 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
1c080 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1c090 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
1c0a0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
1c0b0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
1c0c0 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  ( memcmp(&info, 
1c0d0 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
1c0e0 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
1c0f0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
1c100 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
1c110 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
1c120 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
1c130 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
1c140 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
1c150 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
1c160 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
1c170 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
1c180 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
1c190 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1c1a0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1c1b0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1c1c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
1c1d0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1c1e0 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
1c1f0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1c200 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1c210 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1c220 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1c230 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1c240 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1c250 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1c260 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1c270 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1c280 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1c290 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1c2a0 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1c2b0 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1c2c0 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1c2d0 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1c2e0 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1c2f0 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1c330 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1c340 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1c380 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1c390 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1c3d0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1c3e0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1c3f0 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1c400 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1c410 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70  ->info); \.    p
1c420 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1c430 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c460 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
1c470 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1c4c0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1c4d0 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c500 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1c510 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
1c520 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _VER */..#ifndef
1c530 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
1c540 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
1c550 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1c560 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1c570 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
1c580 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
1c590 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
1c5a0 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
1c5b0 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
1c5c0 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
1c5d0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
1c5e0 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
1c5f0 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
1c600 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
1c610 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
1c620 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
1c630 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1c640 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
1c650 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1c660 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
1c670 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1c680 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
1c690 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c6a0 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
1c6b0 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
1c6c0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1c6d0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1c6e0 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
1c6f0 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
1c700 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
1c710 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1c720 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
1c730 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1c740 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
1c750 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
1c760 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
1c770 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
1c780 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
1c790 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
1c7a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c7b0 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
1c7c0 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
1c7d0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1c7e0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1c7f0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
1c800 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
1c810 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
1c820 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1c830 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
1c840 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1c850 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
1c860 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1c870 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
1c880 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
1c890 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
1c8a0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
1c8b0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1c8c0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1c8d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1c8e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1c8f0 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
1c900 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1c910 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
1c920 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1c930 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
1c940 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pSize = 0;.  }el
1c950 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49  se{.    getCellI
1c960 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a  nfo(pCur);.    *
1c970 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1c980 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  fo.nKey;.  }.  r
1c990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c9a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1c9b0 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1c9c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1c9d0 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1c9e0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1c9f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1ca00 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
1ca10 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
1ca20 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
1ca30 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1ca40 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
1ca50 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
1ca60 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1ca70 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1ca80 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
1ca90 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
1caa0 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
1cab0 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
1cac0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
1cad0 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1cae0 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
1caf0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
1cb00 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1cb10 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
1cb20 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
1cb30 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
1cb40 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
1cb50 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
1cb60 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1cb70 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
1cb80 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
1cb90 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
1cba0 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1cbb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1cbc0 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1cbd0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1cbe0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1cbf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1cc00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1cc10 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
1cc20 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1cc30 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1cc40 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65  info.nData;.  re
1cc50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cc60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1cc70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1cc80 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
1cc90 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1cca0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
1ccb0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
1ccc0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
1ccd0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1cce0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1ccf0 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
1cd00 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
1cd10 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
1cd20 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
1cd30 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
1cd40 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
1cd50 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
1cd60 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
1cd70 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
1cd80 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
1cd90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1cda0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1cdb0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1cdc0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
1cdd0 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
1cde0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
1cdf0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1ce00 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1ce10 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
1ce20 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
1ce30 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
1ce40 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
1ce50 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
1ce60 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
1ce70 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
1ce80 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
1ce90 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
1cea0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1ceb0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
1cec0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
1ced0 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
1cee0 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
1cef0 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
1cf00 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
1cf10 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
1cf20 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
1cf30 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1cf40 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1cf50 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
1cf60 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
1cf70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
1cf80 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
1cf90 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
1cfa0 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
1cfb0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
1cfc0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
1cfd0 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
1cfe0 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
1cff0 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
1d000 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
1d010 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1d020 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1d030 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1d040 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1d050 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1d060 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1d070 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
1d080 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1d090 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1d0a0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
1d0b0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1d0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1d0d0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
1d0e0 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
1d0f0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
1d100 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
1d110 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
1d120 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
1d130 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
1d140 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
1d150 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
1d160 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d170 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1d180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d190 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1d1a0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
1d1b0 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
1d1c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1d1d0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
1d1e0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
1d1f0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1d200 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
1d210 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
1d220 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
1d230 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
1d240 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
1d250 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
1d260 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
1d270 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
1d280 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
1d290 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
1d2a0 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
1d2b0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
1d2c0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
1d2d0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
1d2e0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
1d2f0 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
1d300 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
1d310 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1d320 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1d330 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
1d340 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
1d350 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
1d360 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
1d370 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1d380 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
1d390 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
1d3a0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1d3b0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
1d3c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
1d3d0 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  ss<=pagerPagecou
1d3e0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
1d3f0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1d400 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
1d410 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
1d420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d430 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
1d440 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1d450 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
1d460 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
1d470 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
1d480 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d4a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1d4b0 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
1d4c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1d4d0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1d4e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d4f0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1d500 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
1d510 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ge, 0);.    asse
1d520 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1d530 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b  K || pPage==0 );
1d540 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d560 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
1d570 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
1d580 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
1d590 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
1d5a0 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
1d5b0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
1d5c0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
1d5d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1d5e0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1d5f0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
1d600 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
1d610 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
1d620 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
1d630 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
1d640 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
1d650 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
1d660 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
1d670 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
1d680 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
1d690 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1d6a0 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
1d6b0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
1d6c0 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
1d6d0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1d6e0 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
1d6f0 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
1d700 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
1d710 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
1d720 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
1d730 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d740 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1d750 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
1d760 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
1d770 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
1d780 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1d790 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
1d7a0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1d7b0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1d7c0 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
1d7d0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
1d7e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1d7f0 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
1d800 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
1d810 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d820 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
1d830 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d850 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
1d860 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
1d870 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1d880 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d890 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
1d8a0 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d8c0 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
1d8d0 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
1d8e0 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
1d8f0 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
1d900 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
1d910 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
1d920 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
1d930 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
1d940 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
1d950 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
1d960 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
1d970 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
1d980 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d990 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1d9a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d9b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d9c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
1d9d0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
1d9e0 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
1d9f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
1da00 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
1da10 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
1da20 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
1da30 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
1da40 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
1da50 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1da60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1da70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1da80 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
1da90 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
1daa0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
1dab0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
1dac0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
1dad0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
1dae0 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
1daf0 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
1db00 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
1db10 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
1db20 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
1db30 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
1db40 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
1db50 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
1db60 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
1db70 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1db80 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
1db90 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
1dba0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
1dbb0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
1dbc0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
1dbd0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
1dbe0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
1dbf0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
1dc00 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
1dc10 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
1dc20 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
1dc30 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
1dc40 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
1dc50 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
1dc60 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
1dc70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
1dc80 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
1dc90 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1dca0 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
1dcb0 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
1dcc0 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
1dcd0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
1dce0 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
1dcf0 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
1dd00 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
1dd10 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
1dd20 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1dd30 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
1dd40 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
1dd50 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
1dd60 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
1dd70 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
1dd80 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
1dd90 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
1dda0 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
1ddb0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
1ddc0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1ddd0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1dde0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1ddf0 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
1de00 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
1de10 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
1de20 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
1de30 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
1de40 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
1de50 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
1de60 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
1de70 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
1de80 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
1de90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
1dea0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
1deb0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
1dec0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
1ded0 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
1dee0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
1def0 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
1df00 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
1df10 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
1df20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
1df30 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
1df40 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
1df50 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
1df60 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
1df70 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
1df80 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1df90 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1dfa0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
1dfb0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
1dfc0 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
1dfd0 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
1dfe0 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
1dff0 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
1e000 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
1e010 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
1e020 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
1e030 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1e040 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
1e050 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
1e060 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
1e070 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
1e080 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
1e090 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
1e0a0 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
1e0b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1e0c0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
1e0d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e0e0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
1e0f0 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
1e100 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
1e110 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e120 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72  ->iPage]; /* Btr
1e130 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
1e140 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
1e150 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1e160 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
1e170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
1e180 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
1e190 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
1e1a0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
1e1b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1e1c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e1d0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1e1e0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1e1f0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
1e200 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
1e210 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e220 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e230 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
1e240 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
1e250 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
1e260 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
1e270 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79  .nHeader;.  nKey
1e280 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65   = (pPage->intKe
1e290 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75  y ? 0 : (int)pCu
1e2a0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a  r->info.nKey);..
1e2b0 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73    if( NEVER(offs
1e2c0 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1e2d0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20  ur->info.nData) 
1e2e0 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64  .   || &aPayload
1e2f0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
1e300 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44  al] > &pPage->aD
1e310 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
1e320 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ize].  ){.    /*
1e330 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
1e340 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
1e350 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
1e360 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
1e370 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e380 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e390 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
1e3a0 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
1e3b0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
1e3c0 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
1e3d0 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
1e3e0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
1e3f0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
1e400 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
1e410 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
1e420 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
1e430 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
1e440 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
1e450 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
1e460 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
1e470 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
1e480 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
1e490 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65  f, a, eOp, pPage
1e4a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e4b0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
1e4c0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
1e4d0 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
1e4e0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
1e4f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e500 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  l;.  }..  if( rc
1e510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
1e520 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
1e530 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
1e540 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1e550 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
1e560 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
1e570 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
1e580 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
1e590 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
1e5a0 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
1e5b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1e5c0 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ]);..#ifndef SQL
1e5d0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1e5e0 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
1e5f0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1e600 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
1e610 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
1e620 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a  verflow[].    **
1e630 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
1e640 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
1e650 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72  e it now. The ar
1e660 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a  ray is sized at.
1e670 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79      ** one entry
1e680 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
1e690 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  ow page in the o
1e6a0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
1e6b0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e  he.    ** page n
1e6c0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
1e6d0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
1e6e0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   is stored in aO
1e6f0 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20  verflow[0],.    
1e700 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ** etc. A value 
1e710 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
1e720 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65  rflow[] array me
1e730 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
1e740 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20  wn".    ** (the 
1e750 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
1e760 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
1e770 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
1e780 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
1e790 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  e && !pCur->aOve
1e7a0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69  rflow ){.      i
1e7b0 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
1e7c0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
1e7d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e7e0 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
1e7f0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43  flSize;.      pC
1e800 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
1e810 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d  (Pgno *)sqlite3M
1e820 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
1e830 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20  (Pgno)*nOvfl);. 
1e840 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73       /* nOvfl is
1e850 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
1e860 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a 65  .  If it were ze
1e870 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64  ro, fetchPayload
1e880 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20   would have.    
1e890 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69    ** been used i
1e8a0 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20 72  nstead of this r
1e8b0 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20  outine. */.     
1e8c0 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66   if( ALWAYS(nOvf
1e8d0 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  l) && !pCur->aOv
1e8e0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1e8f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1e900 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
1e910 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1e920 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1e930 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
1e940 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
1e950 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
1e960 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
1e970 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
1e980 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
1e990 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
1e9a0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
1e9b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
1e9c0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
1e9d0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1e9e0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
1e9f0 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
1ea00 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
1ea10 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
1ea20 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
1ea30 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
1ea40 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
1ea50 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
1ea60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1ea70 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
1ea80 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
1ea90 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
1eaa0 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  +){..#ifndef SQL
1eab0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1eac0 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  B.      /* If re
1ead0 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
1eae0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1eaf0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
1eb00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
1eb10 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1eb20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
1eb30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1eb40 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
1eb50 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
1eb60 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
1eb70 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1eb80 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
1eb90 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ge;.      }.#end
1eba0 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  if..      if( of
1ebb0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
1ebc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1ebd0 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
1ebe0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
1ebf0 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
1ec00 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1ec10 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
1ec20 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1ec30 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1ec40 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
1ec50 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
1ec60 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
1ec70 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
1ec80 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
1ec90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
1eca0 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
1ecb0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
1ecc0 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
1ecd0 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
1ece0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
1ecf0 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65         */.#ifnde
1ed00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1ed10 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69  CRBLOB.        i
1ed20 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1ed30 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1ed40 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
1ed50 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
1ed60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1ed70 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
1ed80 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23         } else .#
1ed90 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
1eda0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
1edb0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
1edc0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
1edd0 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
1ede0 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
1edf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ee00 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
1ee10 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
1ee20 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
1ee30 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
1ee40 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
1ee50 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
1ee60 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
1ee70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
1ee80 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
1ee90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50    */.        DbP
1eea0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
1eeb0 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
1eec0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
1eed0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1eee0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
1eef0 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29  tPage, &pDbPage)
1ef00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ef10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ef20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
1ef30 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
1ef40 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
1ef50 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
1ef60 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1ef70 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
1ef80 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
1ef90 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
1efa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20  {.            a 
1efb0 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
1efc0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  set;.          }
1efd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1efe0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
1eff0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
1f000 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
1f010 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f020 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1f030 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
1f040 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
1f050 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
1f060 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
1f070 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1f080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f090 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1f0a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f0b0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
1f0c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f0d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1f0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f0f0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
1f100 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
1f110 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1f120 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1f130 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
1f140 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
1f150 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
1f160 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
1f170 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
1f180 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  t"..**.** The ca
1f190 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
1f1a0 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
1f1b0 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
1f1c0 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20  d row.** in the 
1f1d0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
1f1e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1f1f0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
1f200 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
1f210 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
1f220 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
1f230 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
1f240 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
1f250 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
1f260 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
1f270 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
1f280 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
1f290 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
1f2a0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
1f2b0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
1f2c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f2d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f2e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f2f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f300 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1f310 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
1f320 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1f330 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1f340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f350 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1f360 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
1f370 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1f380 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
1f390 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
1f3a0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
1f3b0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
1f3c0 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
1f3d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
1f3e0 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
1f3f0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
1f400 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
1f410 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
1f420 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
1f430 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
1f440 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
1f450 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
1f460 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
1f470 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1f480 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
1f490 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
1f4a0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1f4b0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
1f4c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
1f4d0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
1f4e0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
1f4f0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
1f500 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1f510 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
1f520 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
1f530 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
1f540 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
1f550 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20  nt rc;..#ifndef 
1f560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1f570 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72  BLOB.  if ( pCur
1f580 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f590 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1f5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
1f5b0 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ORT;.  }.#endif.
1f5c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f5d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f5e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1f5f0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1f600 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1f610 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f620 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1f630 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f640 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
1f650 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1f660 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
1f670 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f680 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
1f690 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f6a0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
1f6b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f6c0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
1f6d0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
1f6e0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
1f6f0 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
1f700 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f710 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1f720 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1f730 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
1f740 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
1f750 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
1f760 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
1f770 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
1f780 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
1f790 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
1f7a0 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b  ** the key if sk
1f7b0 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20  ipKey==0 and it 
1f7c0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65  points to the be
1f7d0 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
1f7e0 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31  if.** skipKey==1
1f7f0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
1f800 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
1f810 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20  ble key/data is 
1f820 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
1f830 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
1f840 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
1f850 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  lue returned wil
1f860 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61  l not be.** a va
1f870 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
1f880 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f890 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1f8a0 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
1f8b0 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
1f8c0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
1f8d0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
1f8e0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
1f8f0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
1f900 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
1f910 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
1f920 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
1f930 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
1f940 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
1f950 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
1f960 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
1f970 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
1f980 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
1f990 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
1f9a0 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
1f9b0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
1f9c0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
1f9d0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
1f9e0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
1f9f0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
1fa00 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
1fa10 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
1fa20 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
1fa30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
1fa40 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
1fa50 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
1fa60 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1fa70 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
1fa80 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
1fa90 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
1faa0 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
1fab0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1fac0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
1fad0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1fae0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
1faf0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1fb00 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
1fb10 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
1fb20 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
1fb30 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20  */.  int *pAmt, 
1fb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1fb50 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1fb60 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
1fb70 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
1fb80 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
1fb90 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
1fba0 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
1fbb0 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
1fbc0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fbd0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
1fbe0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
1fbf0 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e  32 nKey;.  u32 n
1fc00 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
1fc10 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
1fc20 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1fc30 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1fc40 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
1fc50 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1fc60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1fc70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1fc80 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fc90 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ur) );.  pPage =
1fca0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1fcb0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
1fcc0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1fcd0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1fce0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1fcf0 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
1fd00 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20  >info.nSize==0) 
1fd10 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  ){.    btreePars
1fd20 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1fd30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c  ge[pCur->iPage],
1fd40 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1fd50 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20  r->iPage],.     
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
1fd70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a  Cur->info);.  }.
1fd80 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1fd90 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
1fda0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
1fdb0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1fdc0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
1fdd0 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
1fde0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1fdf0 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70     nKey = (int)p
1fe00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1fe10 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
1fe20 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
1fe30 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
1fe40 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1fe50 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
1fe60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1fe70 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1fe80 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61  fo.nLocal;.    a
1fe90 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e  ssert( nLocal<=n
1fea0 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41  Key );.  }.  *pA
1feb0 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1fec0 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1fed0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1fee0 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1fef0 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1ff00 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1ff10 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1ff20 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1ff30 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1ff40 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1ff50 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1ff60 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1ff70 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1ff80 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1ff90 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1ffa0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1ffb0 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1ffc0 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1ffd0 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1ffe0 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1fff0 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
20000 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
20010 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
20020 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
20030 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
20040 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
20050 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
20060 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
20070 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
20080 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
20090 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
200a0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
200b0 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
200c0 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
200d0 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
200e0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
200f0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
20100 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
20110 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
20120 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
20130 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
20140 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
20150 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  t){.  const void
20160 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   *p = 0;.  asser
20170 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20180 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
20190 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
201a0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
201b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
201c0 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  r) );.  if( ALWA
201d0 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  YS(pCur->eState=
201e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
201f0 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74  {.    p = (const
20200 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
20210 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
20220 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
20230 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64   p;.}.const void
20240 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
20250 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
20260 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
20270 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  t){.  const void
20280 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   *p = 0;.  asser
20290 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
202a0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
202b0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
202c0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
202d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
202e0 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  r) );.  if( ALWA
202f0 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  YS(pCur->eState=
20300 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
20310 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74  {.    p = (const
20320 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
20330 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
20340 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
20350 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   p;.}.../*.** Mo
20360 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
20370 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
20380 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
20390 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
203a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
203b0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
203c0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
203d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
203e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
203f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
20400 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
20410 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
20420 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
20430 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
20440 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
20450 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
20460 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
20470 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
20480 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
20490 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
204a0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
204b0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
204c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
204d0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
204e0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
204f0 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
20500 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d  .  int i = pCur-
20510 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  >iPage;.  MemPag
20520 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42  e *pNewPage;.  B
20530 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20540 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
20550 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20560 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20570 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
20580 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20590 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
205a0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
205b0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
205c0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
205d0 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
205e0 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
205f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20600 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20610 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
20620 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
20630 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
20640 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
20650 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72  eturn rc;.  pCur
20660 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20  ->apPage[i+1] = 
20670 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
20680 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30  ->aiIdx[i+1] = 0
20690 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
206a0 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  +;..  pCur->info
206b0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
206c0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
206d0 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  0;.  if( pNewPag
206e0 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e  e->nCell<1 || pN
206f0 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d  ewPage->intKey!=
20700 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
20710 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
20720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20730 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
20740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20750 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  K;.}..#ifndef ND
20760 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
20770 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
20780 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
20790 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
207a0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
207b0 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
207c0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
207d0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
207e0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
207f0 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
20800 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
20810 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
20820 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
20830 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
20840 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
20850 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
20860 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
20870 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
20880 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
20890 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
208a0 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
208b0 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
208c0 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
208d0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
208e0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
208f0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
20900 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
20910 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
20920 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
20930 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
20940 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
20950 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
20960 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
20970 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
20980 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
20990 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
209a0 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
209b0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
209c0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
209d0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
209e0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
209f0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
20a00 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
20a10 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
20a20 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
20a30 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
20a40 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
20a50 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
20a60 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
20a70 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
20a80 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
20a90 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
20aa0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
20ab0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
20ac0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
20ad0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
20ae0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
20af0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
20b00 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
20b10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20b20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20b30 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20b40 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20b60 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
20b70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
20b80 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20b90 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
20ba0 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
20bb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20bc0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
20bd0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20be0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
20bf0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20c00 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
20c10 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  .  );.  releaseP
20c20 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
20c30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
20c40 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
20c50 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
20c60 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
20c70 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
20c80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
20c90 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
20ca0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
20cb0 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
20cc0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
20cd0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
20ce0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
20cf0 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
20d00 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
20d10 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
20d20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
20d30 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
20d40 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
20d50 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
20d60 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
20d70 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
20d80 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
20d90 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
20da0 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
20db0 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
20dc0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
20dd0 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
20de0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
20df0 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
20e00 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
20e10 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
20e20 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
20e30 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
20e40 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
20e50 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
20e60 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
20e70 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
20e80 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
20e90 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
20ea0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
20eb0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
20ec0 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
20ed0 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
20ee0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
20ef0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
20f00 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
20f10 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
20f20 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
20f30 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
20f40 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
20f50 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
20f60 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
20f70 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
20f80 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
20f90 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
20fa0 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
20fb0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
20fc0 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
20fd0 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
20fe0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
20ff0 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
21000 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
21010 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
21020 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
21030 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
21040 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
21050 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
21060 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
21070 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
21080 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
21090 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
210a0 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
210b0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
210c0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
210d0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
210e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
210f0 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
21100 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
21110 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
21120 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
21130 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
21140 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
21150 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
21160 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
21170 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
21180 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
21190 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
211a0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
211b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
211c0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
211d0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
211e0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
211f0 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
21200 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
21210 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
21220 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
21230 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21240 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
21250 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
21260 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
21270 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
21280 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
21290 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
212a0 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
212b0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
212c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
212d0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75   for(i=1; i<=pCu
212e0 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
212f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21300 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
21310 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ]);.    }.    pC
21320 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
21330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
21340 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
21350 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
21360 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
21370 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  ge[0]);.    if( 
21380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21390 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
213a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
213b0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
213c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
213d0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
213e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75  ;..    /* If pCu
213f0 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
21400 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
21410 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
21420 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
21430 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64  .    ** expected
21440 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
21450 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
21460 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
21470 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a  eyInfo is.    **
21480 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
21490 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
214a0 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
214b0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
214c0 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e,.    ** return
214d0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
214e0 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  PT error.  */.  
214f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21500 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
21510 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70  y==1 || pCur->ap
21520 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
21530 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
21540 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
21550 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  )!=pCur->apPage[
21560 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
21570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21580 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21590 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
215a0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
215b0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20  root page is of 
215c0 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
215d0 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74  . This must be t
215e0 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20  he.  ** case as 
215f0 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  the call to this
21600 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c   function that l
21610 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70  oaded the root-p
21620 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a  age (either.  **
21630 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20   this call or a 
21640 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74  previous invocat
21650 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20  ion) would have 
21660 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
21670 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  ion .  ** if the
21680 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65   assumption were
21690 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69   not true, and i
216a0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
216b0 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20  e for the flags 
216c0 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61  .  ** byte to ha
216d0 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
216e0 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73   while this curs
216f0 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  or is holding a 
21700 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74  reference.  ** t
21710 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a  o the page.  */.
21720 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
21730 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
21740 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
21750 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
21760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
21770 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28  oot->isInit && (
21780 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
21790 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)==pRoot->intKe
217a0 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69  y );..  pCur->ai
217b0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
217c0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
217d0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
217e0 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
217f0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
21800 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
21810 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
21820 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
21830 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
21840 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
21850 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
21860 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21870 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
21880 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
21890 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
218a0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
218b0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
218c0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
218d0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
218e0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
218f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
21900 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
21910 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
21920 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
21930 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
21940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21950 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
21960 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
21970 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
21980 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
21990 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
219a0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
219b0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
219c0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
219d0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
219e0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
219f0 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
21a00 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
21a10 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
21a20 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
21a30 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
21a40 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
21a50 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
21a60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21a70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
21a80 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21a90 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21aa0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21ab0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21ac0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
21ad0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
21ae0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
21af0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21b00 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
21b10 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
21b20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21b30 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
21b40 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
21b50 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
21b60 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
21b70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21b80 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
21b90 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
21ba0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
21bb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21bc0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
21bd0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
21be0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
21bf0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
21c00 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
21c10 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
21c20 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
21c30 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
21c40 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
21c50 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
21c60 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
21c70 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
21c80 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
21c90 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
21ca0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
21cb0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
21cc0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
21cd0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
21ce0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
21cf0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
21d00 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
21d10 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
21d20 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
21d30 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
21d40 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
21d50 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
21d60 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
21d70 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
21d80 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
21d90 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
21da0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
21db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
21dc0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
21dd0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
21de0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21df0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21e00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21e10 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21e20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21e30 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
21e40 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21e50 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
21e60 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
21e70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
21e80 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
21e90 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
21ea0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
21eb0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
21ec0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
21ed0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
21ee0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
21ef0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
21f10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21f20 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
21f30 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
21f40 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
21f50 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
21f60 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
21f70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21f80 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21f90 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
21fa0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
21fb0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
21fc0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
21fd0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
21fe0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
21ff0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
22000 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
22010 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
22020 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
22030 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
22040 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
22050 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
22060 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
22070 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
22080 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22090 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
220a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
220b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
220c0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
220d0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
220e0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
220f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22100 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
22110 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22120 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
22130 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
22140 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22150 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
22160 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
22170 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
22180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
22190 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
221a0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
221b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
221c0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
221d0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
221e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
221f0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
22200 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
22210 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
22220 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
22230 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
22240 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
22250 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
22260 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
22270 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
22280 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
22290 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
222a0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
222b0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
222c0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
222d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
222e0 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
222f0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
22300 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
22310 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22320 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22330 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
22340 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22350 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
22360 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
22370 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
22380 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
22390 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
223a0 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
223b0 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
223c0 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
223d0 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72  ->eState && pCur
223e0 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64  ->atLast ){.#ifd
223f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
22400 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
22410 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
22420 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
22430 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
22440 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
22450 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
22460 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
22470 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
22480 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
22490 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
224a0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
224b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
224c0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
224d0 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
224e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
224f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22500 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
22510 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22520 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
22530 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22540 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22550 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
22560 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
22570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22580 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
22590 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
225a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
225b0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
225c0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
225d0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
225e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
225f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22600 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
22610 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
22620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22630 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22640 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22650 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
22660 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
22670 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
22680 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
22690 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63  Cur->atLast = rc
226a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30  ==SQLITE_OK ?1:0
226b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
226c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
226d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
226e0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
226f0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
22700 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
22710 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
22720 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
22730 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
22740 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
22750 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
22760 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
22770 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
22780 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
22790 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
227a0 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
227b0 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
227c0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
227d0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
227e0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
227f0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
22800 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
22810 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
22820 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
22830 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
22840 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
22850 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
22860 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
22870 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
22880 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
22890 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
228a0 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
228b0 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
228c0 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
228d0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
228e0 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
228f0 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
22900 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
22910 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
22920 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
22930 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
22940 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
22950 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
22960 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
22970 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
22980 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
22990 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
229a0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
229b0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
229c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
229d0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
229e0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
229f0 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
22a00 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
22a20 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
22a30 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
22a40 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
22a50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
22a60 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
22a70 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
22a80 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
22a90 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
22aa0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
22ab0 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
22ac0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
22ad0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
22ae0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
22af0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
22b00 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
22b30 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
22b40 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
22b50 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
22b60 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
22b70 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
22b80 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
22b90 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
22ba0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
22bb0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
22bc0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
22bd0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22bf0 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
22c00 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
22c10 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
22c20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
22c30 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
22c40 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
22c50 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
22c60 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22c70 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
22c80 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
22c90 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
22ca0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22cb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
22cc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
22cd0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
22ce0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
22cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
22d00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
22d10 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
22d20 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
22d30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
22d40 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
22d50 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
22d60 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
22d70 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
22d80 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
22d90 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
22da0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
22db0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
22dc0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22dd0 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
22de0 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
22df0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
22e00 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
22e10 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
22e20 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
22e30 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
22e40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22e50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
22e60 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
22e70 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
22e80 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
22e90 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
22ea0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
22eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
22ec0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
22ed0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
22ee0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
22ef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
22f00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22f10 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22f20 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
22f30 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22f40 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
22f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22f60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22f70 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
22f80 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
22f90 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
22fa0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
22fb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
22fc0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
22fd0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
22fe0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22ff0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23000 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
23010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23020 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
23030 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
23040 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
23050 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
23060 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
23070 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
23080 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
23090 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
230a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
230b0 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  ge];.    int c;.
230c0 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
230d0 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
230e0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
230f0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
23100 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
23110 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
23120 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
23130 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
23140 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
23150 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
23160 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
23170 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
23180 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
23190 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
231a0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
231b0 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
231c0 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
231d0 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
231e0 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
231f0 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
23200 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
23210 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
23220 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
23230 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
23240 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
23250 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
23260 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
23270 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
23280 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
23290 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
232a0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
232b0 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
232c0 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
232d0 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
232e0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
232f0 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
23300 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
23310 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
23320 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73  16)upr;.    }els
23330 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
23340 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23350 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c  ] = (u16)((upr+l
23360 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  wr)/2);.    }.  
23370 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
23380 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
23390 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
233a0 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66  ge]; /* Index of
233b0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
233c0 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20   pPage */.      
233d0 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
23400 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
23410 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
23420 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23430 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ze = 0;.      pC
23440 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
23450 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
23460 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
23470 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
23480 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
23490 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
234a0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
234b0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
234c0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
234d0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
234e0 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
234f0 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
23500 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
23510 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
23520 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
23530 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
23540 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69   if( nCellKey==i
23550 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
23560 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
23570 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
23580 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
23590 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
235a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
235b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
235c0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
235d0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
235e0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
235f0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76  .        pCur->v
23600 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
23610 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
23620 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
23630 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
23650 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
23660 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37  page-size is 327
23670 36 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  68 bytes. This m
23680 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
23690 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
236a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
236b0 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
236c0 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
236d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
236e0 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39  e is at most 819
236f0 38 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d  8 bytes, which m
23700 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
23710 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
23720 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
23730 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
23740 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
23750 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
23760 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
23770 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
23780 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
23790 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
237a0 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
237b0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
237c0 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
237d0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
237e0 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
237f0 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
23800 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
23810 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
23820 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  /.        int nC
23830 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
23840 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43          if( !(nC
23850 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e  ell & 0x80) && n
23860 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
23870 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
23880 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
23890 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
238a0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
238b0 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
238c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
238d0 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
238e0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
238f0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
23900 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
23910 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
23920 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
23930 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
23940 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
23950 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
23960 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
23970 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
23980 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
23990 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
239a0 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
239b0 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
239c0 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
239d0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
239e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
239f0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
23a00 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
23a10 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
23a20 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
23a30 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
23a40 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
23a50 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
23a60 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
23a70 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
23a80 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
23a90 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
23aa0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
23ab0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23ad0 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
23ae0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
23af0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
23b00 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
23b10 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
23b20 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
23b30 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
23b40 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
23b50 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
23b60 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
23b70 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
23b80 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
23b90 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
23ba0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
23bb0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
23bc0 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
23bd0 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  alled. */.      
23be0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
23bf0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
23c00 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
23c10 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
23c20 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
23c30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  ;.          btre
23c40 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
23c50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
23c60 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
23c70 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
23c80 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
23c90 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
23ca0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
23cb0 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20  e3Malloc( nCell 
23cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23cd0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23cf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23d00 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
23d10 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
23d20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23d30 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
23d40 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
23d50 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
23d60 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
23d70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23d80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
23d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23da0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
23db0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
23dc0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
23dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23de0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
23df0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
23e00 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
23e10 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
23e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23e30 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
23e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23e50 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
23e60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
23e70 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
23e80 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
23e90 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
23ea0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70  dx;.          up
23eb0 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20  r = lwr - 1;.   
23ec0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23ed0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23ee0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
23ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
23f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23f10 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
23f20 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
23f30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23f40 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
23f50 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
23f60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23f70 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
23f80 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
23f90 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
23fa0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
23fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
23fc0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23fd0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28  iPage] = (u16)((
23fe0 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20  lwr+upr)/2);.   
23ff0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
24000 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20  wr==upr+1 );.   
24010 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
24020 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
24030 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
24040 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
24050 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
24060 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
24070 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
24080 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
24090 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
240a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
240b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
240c0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
240d0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
240e0 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
240f0 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
24100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
24110 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
24120 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
24130 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24140 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
24150 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
24160 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
24170 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
24180 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
24190 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
241a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
241b0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
241c0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
241d0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
241e0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
241f0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
24200 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
24210 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
24220 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
24230 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
24240 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
24250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
24260 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
24270 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
24280 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
24290 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
242a0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
242b0 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
242c0 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
242d0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
242e0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
242f0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
24300 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
24310 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
24320 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
24330 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
24340 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
24350 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
24360 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
24370 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
24380 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
24390 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
243a0 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
243b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
243c0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
243d0 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
243e0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
243f0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
24400 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
24410 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
24420 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
24430 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
24440 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
24450 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
24460 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
24470 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
24480 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
24490 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
244a0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
244b0 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
244c0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
244d0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
244e0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
244f0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
24500 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
24510 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
24520 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
24530 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
24540 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
24550 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
24560 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
24570 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24580 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
24590 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
245a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
245b0 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
245c0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
245d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
245e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
245f0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
24600 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
24610 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
24620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
24630 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
24640 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
24650 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
24660 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
24670 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
24680 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
24690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
246a0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
246b0 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ext>0 ){.    pCu
246c0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
246d0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
246e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
246f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
24700 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
24710 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
24720 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24730 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
24740 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24750 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
24760 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
24770 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t );.  assert( i
24780 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx<=pPage->nCell
24790 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66   );..  pCur->inf
247a0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
247b0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
247c0 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70   0;.  if( idx>=p
247d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
247e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
247f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
24800 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
24810 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
24820 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
24830 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
24840 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
24850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24860 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
24870 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
24880 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24890 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
248a0 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
248b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
248c0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
248d0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
248e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
248f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
24900 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
24910 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24920 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
24930 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
24940 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
24950 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24960 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
24970 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
24980 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
24990 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
249a0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
249b0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
249c0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
249d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
249e0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
249f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24a10 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
24a20 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
24a30 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
24a40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
24a50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24a60 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
24a70 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
24a80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24a90 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
24aa0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
24ab0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
24ac0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
24ad0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
24ae0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
24af0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
24b00 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
24b10 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
24b20 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
24b30 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
24b40 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
24b50 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
24b60 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
24b70 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
24b80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24b90 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
24ba0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
24bb0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
24bc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24bd0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
24be0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24bf0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
24c00 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
24c10 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
24c20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24c30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24c40 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74  ;.  }.  pCur->at
24c50 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
24c60 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
24c70 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
24c80 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
24c90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24ca0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
24cb0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
24cc0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
24cd0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a  pNext = 0;.    *
24ce0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
24cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24d00 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
24d10 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61  Next = 0;..  pPa
24d20 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24d30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
24d40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
24d50 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
24d60 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
24d70 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
24d80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24d90 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
24da0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
24db0 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
24dc0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
24dd0 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
24de0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24df0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
24e00 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
24e10 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
24e20 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
24e30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24e40 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
24e50 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
24e60 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
24e70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
24e80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
24e90 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
24ea0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
24eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24ec0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
24ed0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
24ee0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
24ef0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
24f00 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
24f10 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
24f20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24f30 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
24f40 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24f50 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
24f60 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
24f70 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
24f80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
24f90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
24fa0 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
24fb0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
24fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24fd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
24fe0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
24ff0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25000 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
25010 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
25020 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
25030 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
25040 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
25050 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
25060 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
25070 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
25080 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
25090 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
250a0 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
250b0 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
250c0 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
250d0 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
250e0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
250f0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
25100 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
25110 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
25120 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
25130 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
25140 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
25150 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
25160 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
25170 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
25180 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
25190 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
251a0 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
251b0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
251c0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
251d0 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
251e0 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
251f0 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
25200 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
25210 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
25220 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
25230 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
25240 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65  t 0, then a (fee
25250 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d  ble) effort is m
25260 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
25270 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
25280 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
25290 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
252a0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
252b0 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
252c0 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
252d0 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
252e0 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
252f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
25300 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
25310 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
25320 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
25330 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65  .**.** If the "e
25340 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20  xact" parameter 
25350 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68  is not 0, and th
25360 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65  e page-number ne
25370 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20  arby exists .** 
25380 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
25390 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
253a0 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  it is guarenteed
253b0 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
253c0 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
253d0 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
253e0 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77  cuum databases w
253f0 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  hen allocating a
25400 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   new table..*/.s
25410 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
25420 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
25430 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
25440 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
25450 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e  e, .  Pgno *pPgn
25460 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62  o, .  Pgno nearb
25470 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b  y,.  u8 exact.){
25480 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25490 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
254a0 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
254b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
254c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
254d0 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
254e0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
254f0 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
25500 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
25510 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
25520 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
25530 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
25540 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
25550 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
25560 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
25570 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
25580 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25590 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
255a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
255b0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
255c0 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61 67  ;.  mxPage = pag
255d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
255e0 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
255f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
25600 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
25610 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
25620 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
25630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25640 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25650 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
25660 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
25670 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
25680 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
25690 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
256a0 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
256b0 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
256c0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
256d0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
256e0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
256f0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
25700 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
25710 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63   /* If the 'exac
25720 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73  t' parameter was
25730 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72   true and a quer
25740 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
25750 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
25760 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
25770 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
25780 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
25790 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
257a0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
257b0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
257c0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
257d0 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
257e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
257f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
25800 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62  ( exact && nearb
25810 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
25820 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
25830 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
25840 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  y>0 );.      ass
25850 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
25860 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63  cuum );.      rc
25870 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
25880 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
25890 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
258a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
258b0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
258c0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
258d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72   ){.        sear
258e0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
258f0 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f    }.      *pPgno
25900 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d   = nearby;.    }
25910 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
25920 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
25930 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
25940 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
25950 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
25960 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
25970 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
25980 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
25990 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
259a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
259b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
259c0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
259d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
259e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
259f0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
25a00 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
25a10 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
25a20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
25a30 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
25a40 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
25a50 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
25a60 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
25a70 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
25a80 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
25a90 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
25aa0 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
25ab0 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
25ac0 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
25ad0 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a  by' is located..
25ae0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
25af0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
25b00 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
25b10 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
25b20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
25b30 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
25b40 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
25b50 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
25b60 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
25b70 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
25b80 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
25b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
25ba0 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
25bb0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
25bc0 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
25bd0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ge ){.        rc
25be0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
25bf0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
25c00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
25c10 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
25c20 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
25c30 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
25c40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
25c50 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
25c60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
25c70 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25c80 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
25c90 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
25ca0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
25cb0 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
25cc0 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
25cd0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
25ce0 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
25cf0 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
25d00 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
25d10 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
25d20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
25d30 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
25d40 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
25d50 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
25d60 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
25d70 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
25d80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25d90 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
25da0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
25db0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25dc0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
25dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
25de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
25df0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25e00 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
25e10 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
25e20 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
25e30 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
25e40 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
25e50 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
25e60 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
25e70 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
25e80 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
25e90 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
25ea0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
25eb0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
25ec0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
25ed0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
25ee0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
25ef0 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
25f00 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
25f10 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
25f20 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
25f30 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
25f40 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
25f50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25f60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25f70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
25f80 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
25f90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25fa0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
25fb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
25fc0 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
25fd0 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
25fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
25ff0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
26000 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
26010 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
26020 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
26030 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
26040 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
26050 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
26060 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26070 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
26080 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
26090 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
260a0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
260b0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
260c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
260d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
260e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
260f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
26100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
26110 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26120 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
26130 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
26140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26150 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
26160 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
26170 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
26180 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
26190 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
261a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
261b0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
261c0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
261d0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
261e0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
261f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26210 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
26220 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
26230 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
26240 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
26250 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
26260 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
26270 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
26280 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
26290 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
262a0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
262b0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
262c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
262d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
262e0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
262f0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
26300 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
26310 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
26320 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
26330 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
26340 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
26350 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
26360 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
26370 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
26380 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
26390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
263a0 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
263b0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
263c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
263d0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
263e0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
263f0 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
26400 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26420 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
26430 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
26440 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26460 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
26470 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
26480 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26490 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
264a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
264b0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
264c0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
264d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
264e0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
264f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
26500 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
26510 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
26520 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
26530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
26540 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
26550 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
26560 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
26570 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
26580 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
26590 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
265a0 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
265b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
265c0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
265d0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
265e0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
265f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26600 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
26610 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
26620 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
26630 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
26640 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
26650 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
26660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26670 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26680 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26690 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
266a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
266b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
266c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
266d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
266e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
266f0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
26700 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
26710 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
26720 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
26730 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26740 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
26750 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
26760 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
26770 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
26780 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
26790 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
267a0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
267b0 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
267c0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
267d0 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
267e0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
267f0 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
26800 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
26810 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
26820 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
26830 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
26840 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26850 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
26860 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
26870 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
26880 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
26890 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
268a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
268b0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
268c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
268d0 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2 i;.          i
268e0 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
268f0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
26900 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
26910 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
26920 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
26930 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
26940 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
26950 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
26960 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
26970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
26980 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
26990 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
269a0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
269b0 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
269c0 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
269d0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
269e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
269f0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
26a10 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
26a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26a30 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
26a40 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
26a50 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
26a60 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
26a70 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
26a80 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
26a90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
26aa0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
26ab0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
26ac0 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
26ad0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26ae0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
26af0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
26b00 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26b10 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
26b20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
26b30 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
26b40 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
26b50 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
26b60 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
26b70 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
26b80 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
26b90 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
26ba0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
26bb0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
26bc0 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
26bd0 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
26be0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
26bf0 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
26c00 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
26c20 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
26c30 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
26c40 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
26c50 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
26c60 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
26c70 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
26c80 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
26c90 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
26ca0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26cb0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
26cc0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
26cd0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26ce0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
26cf0 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e  swriteable(pTrun
26d00 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  k->pDbPage) );. 
26d10 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
26d20 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
26d30 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
26d40 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
26d50 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
26d60 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
26d70 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
26d80 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
26d90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
26db0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26dc0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
26dd0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26de0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26df0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26e00 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
26e10 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
26e20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26e40 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
26e50 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
26e60 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
26e70 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
26e80 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
26e90 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
26ea0 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
26eb0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
26ec0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
26ed0 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
26ee0 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
26ef0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
26f00 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
26f10 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
26f20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26f30 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
26f40 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
26f50 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
26f60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
26f70 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
26f80 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
26f90 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
26fa0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
26fb0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
26fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
26fd0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
26fe0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
26ff0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
27000 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
27010 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
27020 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
27030 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
27040 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
27050 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
27060 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
27070 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
27080 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
27090 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
270a0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
270b0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
270c0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
270d0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
270e0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
270f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
27100 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
27110 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
27120 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
27130 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
27140 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
27150 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
27160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27170 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
27180 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
27190 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
271a0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
271b0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
271c0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
271d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
271e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
271f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27200 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
27210 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
27220 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
27230 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
27240 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
27250 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
27260 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
27270 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
27280 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
27290 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
272a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
272b0 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
272c0 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
272d0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
272e0 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
272f0 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
27300 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
27310 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
27320 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
27330 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
27340 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
27350 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
27360 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
27370 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
27380 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27390 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
273a0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
273b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
273c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
273d0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
273e0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
273f0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
27400 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
27410 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
27420 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
27430 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
27440 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
27450 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
27460 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
27470 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
27480 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
27490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
274a0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
274b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
274c0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
274d0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
274e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
274f0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
27500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27510 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27520 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
27530 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
27540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
27550 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
27560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27570 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
27580 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
27590 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
275a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
275b0 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
275c0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
275d0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
275e0 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
275f0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
27600 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
27610 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
27620 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27630 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
27640 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
27650 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
27660 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
27670 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
27680 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
27690 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
276a0 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
276b0 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
276c0 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
276d0 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
276e0 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
276f0 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
27700 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
27710 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
27720 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
27730 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
27740 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
27750 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
27760 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
27770 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
27780 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
27790 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
277a0 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
277b0 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
277c0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
277d0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
277e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
277f0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
27800 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
27810 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
27820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
27830 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
27840 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
27850 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
27860 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
27870 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
27880 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
27890 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
278a0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278c0 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
278d0 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
278e0 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27910 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
27920 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
27950 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
27960 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
27970 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
27980 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
27990 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
279a0 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29  ssert( iPage>1 )
279b0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
279c0 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
279d0 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
279e0 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  ;..  if( pMemPag
279f0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
27a00 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
27a10 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
27a20 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
27a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
27a40 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
27a50 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
27a60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
27a70 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
27a80 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
27a90 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
27aa0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27ab0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
27ac0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
27ad0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
27ae0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
27af0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
27b00 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
27b10 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
27b20 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
27b30 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63  ..  if( pBt->sec
27b40 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ureDelete ){.   
27b50 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
27b60 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
27b70 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
27b80 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
27b90 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
27ba0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
27bb0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
27bc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
27bd0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
27be0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27bf0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
27c00 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
27c10 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
27c20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27c30 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
27c40 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
27c50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
27c60 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
27c70 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
27c80 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
27c90 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
27ca0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
27cb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
27cc0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
27cd0 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
27ce0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
27cf0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
27d00 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
27d10 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
27d20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
27d30 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
27d40 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
27d50 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
27d60 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
27d70 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
27d80 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
27d90 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
27da0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
27db0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
27dc0 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
27dd0 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
27de0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
27df0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
27e00 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
27e10 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
27e20 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
27e30 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
27e40 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
27e50 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
27e60 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
27e70 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
27e80 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
27e90 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
27ea0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
27eb0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
27ec0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
27ed0 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
27ee0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
27ef0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
27f00 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
27f10 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
27f20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
27f30 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
27f40 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
27f50 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
27f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27f70 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
27f80 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
27f90 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
27fa0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
27fb0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
27fc0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
27fd0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
27fe0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
27ff0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
28000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28010 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
28020 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
28030 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
28040 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
28050 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
28060 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
28070 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
28080 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
28090 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
280a0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
280b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
280c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
280d0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
280e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
280f0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
28100 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
28110 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
28120 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
28130 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
28140 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
28150 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
28160 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
28170 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
28180 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
28190 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
281a0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
281b0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
281c0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
281d0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
281e0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
281f0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
28200 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
28210 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
28220 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
28230 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
28240 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
28250 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
28260 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
28270 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
28280 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
28290 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
282a0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
282b0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
282c0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
282d0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
282e0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
282f0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
28300 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
28310 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
28320 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
28330 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
28340 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
28350 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
28360 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
28370 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
28380 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
28390 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
283a0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
283b0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
283c0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
283d0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
283e0 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
283f0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
28400 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
28410 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
28420 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
28430 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
28440 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
28450 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
28460 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
28470 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
28480 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28490 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
284a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
284b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
284c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
284d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
284e0 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
284f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
28500 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
28510 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
28520 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
28530 20 26 26 20 21 70 42 74 2d 3e 73 65 63 75 72 65   && !pBt->secure
28540 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
28550 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
28560 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
28570 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
28580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
28590 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
285a0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
285b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
285c0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
285d0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
285e0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
285f0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
28600 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
28610 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
28620 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
28630 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
28640 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
28650 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
28660 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
28670 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
28680 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
28690 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
286a0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
286b0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
286c0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
286d0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
286e0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
286f0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
28700 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
28710 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
28720 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
28730 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
28740 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
28750 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
28760 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
28770 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
28780 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
28790 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
287a0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
287b0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
287c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
287d0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
287e0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
287f0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
28800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28810 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
28820 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
28830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28840 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
28850 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
28860 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
28870 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
28880 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
28890 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
288a0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
288b0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
288c0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
288d0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
288e0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
288f0 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
28900 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
28910 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
28920 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
28930 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
28940 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
28950 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
28960 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
28970 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
28980 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
28990 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
289a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
289b0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
289c0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
289d0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
289e0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
289f0 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
28a00 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
28a10 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
28a20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
28a30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
28a40 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
28a50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
28a60 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
28a70 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
28a80 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
28a90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
28aa0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
28ab0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
28ac0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
28ad0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
28ae0 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c  Ovfl;.  u16 ovfl
28af0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
28b00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
28b10 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
28b20 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
28b30 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
28b40 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
28b50 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
28b60 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
28b70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28b80 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
28b90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
28ba0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
28bb0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
28bc0 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
28bd0 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
28be0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
28bf0 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
28c00 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
28c10 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
28c20 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
28c30 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
28c40 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
28c50 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
28c60 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
28c70 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
28c80 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
28c90 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
28ca0 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
28cb0 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
28cc0 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
28cd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
28ce0 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
28cf0 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
28d00 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  flPgno>pagerPage
28d10 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
28d20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
28d30 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
28d40 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
28d50 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
28d60 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
28d70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
28d80 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
28d90 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
28da0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
28db0 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
28dc0 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
28dd0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
28de0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
28df0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
28e00 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
28e10 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
28e20 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
28e30 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
28e40 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
28e50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28e60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
28e70 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
28e80 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
28e90 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
28ea0 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
28eb0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
28ec0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
28ed0 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
28ee0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
28ef0 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
28f00 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
28f10 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
28f20 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
28f30 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
28f40 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
28f50 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
28f60 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
28f70 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
28f80 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
28f90 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
28fa0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
28fb0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
28fc0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
28fd0 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
28fe0 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
28ff0 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
29000 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
29010 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
29020 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
29030 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
29040 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
29050 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
29060 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
29070 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
29080 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
29090 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
290a0 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
290b0 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
290c0 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
290d0 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
290e0 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
290f0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
29100 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
29110 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
29120 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
29130 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
29140 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
29150 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
29160 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
29170 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29180 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29190 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
291a0 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
291b0 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
291c0 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
291d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
291e0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
291f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
29200 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29210 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
29220 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
29230 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
29240 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
29250 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
29260 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
29270 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
29280 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
29290 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
292a0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
292b0 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
292c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
292d0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
292e0 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
292f0 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
29300 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
29310 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
29320 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
29330 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
29340 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
29350 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
29360 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
29370 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
29380 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
29390 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
293a0 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
293b0 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
293c0 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
293d0 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
293e0 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
293f0 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
29400 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
29410 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
29420 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
29430 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
29440 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
29450 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
29460 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
29470 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
29480 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
29490 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
294a0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
294b0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
294c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
294d0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
294e0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
294f0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
29500 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
29510 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
29520 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
29530 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
29540 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
29550 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
29560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
29570 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
29580 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
29590 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
295a0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
295b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
295c0 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
295d0 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
295e0 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
295f0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
29600 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
29610 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
29620 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
29630 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
29640 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
29650 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
29660 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
29670 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
29680 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
29690 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
296a0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
296b0 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
296c0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
296d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
296e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
296f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
29700 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
29710 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
29720 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
29730 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
29740 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
29750 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
29760 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
29770 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
29780 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
29790 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
297a0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
297b0 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
297c0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
297d0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
297e0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
297f0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
29800 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
29810 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
29820 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
29830 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
29840 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
29850 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
29860 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
29870 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
29880 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
29890 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
298a0 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65  ader], nData+nZe
298b0 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ro);.  }else{.  
298c0 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20    nData = nZero 
298d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
298e0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
298f0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
29900 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
29910 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
29920 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
29930 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
29940 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
29950 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
29960 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
29970 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
29980 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
29990 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72  (u32)(nData+nZer
299a0 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  o) );.  .  /* Fi
299b0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
299c0 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
299d0 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
299e0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
299f0 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
29a00 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
29a10 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
29a20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
29a30 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56  se{ .    if( NEV
29a40 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  ER(nKey>0x7fffff
29a50 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29  ff || pKey==0) )
29a60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
29a70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29a80 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  PT;.    }.    nP
29a90 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e  ayload += (int)n
29aa0 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
29ab0 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
29ac0 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a   (int)nKey;.  }.
29ad0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
29ae0 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
29af0 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
29b00 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
29b10 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
29b20 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
29b30 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
29b40 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
29b50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
29b60 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
29b70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
29b80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
29b90 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
29ba0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
29bb0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
29bc0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
29bd0 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
29be0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
29bf0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
29c00 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
29c10 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
29c20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
29c30 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
29c40 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
29c50 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
29c60 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
29c70 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
29c80 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
29c90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
29ca0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
29cb0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
29cc0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
29cd0 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
29ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29cf0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
29d00 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
29d10 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
29d20 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
29d30 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
29d40 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
29d50 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
29d60 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
29d70 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
29d80 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
29d90 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
29da0 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
29db0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
29dc0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
29dd0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
29de0 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
29df0 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
29e00 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
29e10 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
29e20 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
29e30 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
29e40 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
29e50 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
29e60 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
29e70 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
29e80 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
29e90 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
29ea0 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
29eb0 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75  initialised valu
29ec0 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
29ed0 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
29ee0 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
29ef0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
29f00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
29f10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
29f20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29f30 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
29f40 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
29f50 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
29f60 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
29f70 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
29f80 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
29f90 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
29fa0 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
29fb0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
29fc0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
29fd0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
29fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29ff0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
2a000 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
2a010 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2a020 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
2a030 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2a040 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2a050 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
2a060 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
2a070 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
2a080 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
2a090 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
2a0a0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
2a0b0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
2a0c0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2a0d0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2a0e0 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
2a0f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2a100 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
2a110 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
2a120 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
2a130 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
2a140 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
2a150 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
2a160 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
2a170 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
2a180 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
2a190 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
2a1a0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2a1b0 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
2a1c0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
2a1d0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
2a1e0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
2a1f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2a200 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2a210 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2a220 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
2a230 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2a240 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2a250 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
2a260 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
2a270 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
2a280 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
2a290 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
2a2a0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
2a2b0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
2a2c0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
2a2d0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
2a2e0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
2a2f0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
2a300 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
2a310 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
2a320 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
2a330 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2a340 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2a350 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
2a360 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
2a370 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
2a380 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2a390 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2a3a0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2a3b0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
2a3c0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2a3d0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2a3e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2a3f0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2a400 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
2a410 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
2a420 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2a430 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2a440 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2a450 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
2a460 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2a470 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
2a480 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
2a490 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
2a4a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2a4b0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2a4c0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2a4d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2a4e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2a4f0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
2a500 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
2a510 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
2a520 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
2a530 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
2a540 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
2a550 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
2a560 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
2a570 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
2a580 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
2a590 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
2a5a0 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
2a5b0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
2a5c0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
2a5d0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
2a5e0 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
2a5f0 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
2a600 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
2a610 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
2a620 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
2a630 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2a640 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a650 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2a660 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
2a670 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
2a680 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
2a690 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
2a6a0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
2a6b0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
2a6c0 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
2a6d0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
2a6e0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
2a6f0 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
2a700 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
2a710 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
2a720 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
2a730 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
2a740 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
2a750 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
2a760 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
2a770 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2a780 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
2a790 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
2a7a0 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
2a7b0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
2a7c0 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
2a7d0 2a 70 52 43 29 7b 0a 20 20 69 6e 74 20 69 3b 20  *pRC){.  int i; 
2a7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2a7f0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
2a800 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t pc;         /*
2a810 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
2a820 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
2a830 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
2a840 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2a850 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
2a860 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
2a870 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2a880 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
2a890 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
2a8a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
2a8b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2a8c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2a8d0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
2a8e0 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
2a8f0 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d  the header.  0 m
2a900 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20  ost pages.  100 
2a910 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28  page 1 */..  if(
2a920 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2a930 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2a940 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
2a950 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
2a960 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
2a970 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
2a980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a990 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2a9a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2a9b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a9c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2a9d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2a9e0 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
2a9f0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2aa00 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
2aa10 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
2aa20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
2aa30 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
2aa40 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2aa50 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
2aa60 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
2aa70 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
2aa80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
2aa90 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
2aaa0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2aab0 20 69 66 28 20 70 63 20 3c 20 67 65 74 32 62 79   if( pc < get2by
2aac0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2aad0 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
2aae0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2aaf0 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
2ab00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ab10 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
2ab20 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
2ab30 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
2ab40 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
2ab50 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
2ab60 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2ab70 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  }.  for(i=idx+1;
2ab80 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
2ab90 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
2aba0 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
2abb0 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
2abc0 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
2abd0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
2abe0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2abf0 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
2ac00 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
2ac10 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f  nFree += 2;.}../
2ac20 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
2ac30 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
2ac40 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
2ac50 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
2ac60 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
2ac70 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
2ac80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
2ac90 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
2aca0 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
2acb0 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
2acc0 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
2acd0 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
2ace0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
2acf0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2ad00 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
2ad10 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
2ad20 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
2ad30 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
2ad40 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
2ad50 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66  * in pPage->aOvf
2ad60 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
2ad70 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
2ad80 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
2ad90 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
2ada0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
2adb0 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
2adc0 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
2add0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
2ade0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
2adf0 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
2ae00 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
2ae10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
2ae20 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
2ae30 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
2ae40 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2ae50 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
2ae60 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
2ae70 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
2ae80 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2ae90 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
2aea0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
2aeb0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
2aec0 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
2aed0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
2aee0 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
2aef0 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
2af00 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
2af10 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
2af20 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
2af30 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
2af40 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
2af50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2af60 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
2af70 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
2af80 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
2af90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2afa0 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
2afb0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
2afc0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
2afd0 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
2afe0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2aff0 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
2b000 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
2b010 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
2b020 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
2b030 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
2b040 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
2b050 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
2b060 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
2b070 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
2b080 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
2b090 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
2b0a0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
2b0b0 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
2b0c0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
2b0d0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
2b0e0 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
2b0f0 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
2b100 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
2b110 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
2b120 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
2b130 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
2b140 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
2b150 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2b160 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2b170 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
2b180 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
2b190 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
2b1a0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2b1b0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2b1c0 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
2b1d0 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
2b1e0 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
2b1f0 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
2b200 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
2b210 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
2b220 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
2b230 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
2b240 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
2b250 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
2b260 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
2b270 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
2b280 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
2b290 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
2b2a0 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
2b2b0 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
2b2c0 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  ta[] */..  int n
2b2d0 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f  Skip = (iChild ?
2b2e0 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20   4 : 0);..  if( 
2b2f0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
2b300 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
2b310 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
2b320 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
2b330 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
2b340 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
2b350 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2b360 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ) && MX_CELL(pPa
2b370 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29  ge->pBt)<=5460 )
2b380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b390 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
2b3a0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2b3b0 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
2b3c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b3d0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2b3e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
2b3f0 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
2b400 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
2b410 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
2b420 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
2b430 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
2b440 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
2b450 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
2b460 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
2b470 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
2b480 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
2b490 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
2b4a0 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
2b4b0 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
2b4c0 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
2b4d0 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
2b4e0 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
2b4f0 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
2b500 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
2b510 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
2b520 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
2b530 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
2b540 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
2b550 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
2b560 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2b570 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
2b580 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
2b590 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
2b5a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
2b5b0 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
2b5c0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
2b5d0 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
2b5e0 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
2b5f0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
2b600 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
2b610 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
2b620 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
2b630 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2b640 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
2b650 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
2b660 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2b670 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
2b680 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
2b690 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
2b6a0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
2b6b0 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
2b6c0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
2b6d0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
2b6e0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
2b6f0 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a  ].idx = (u16)i;.
2b700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
2b710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b720 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2b730 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2b740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b750 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
2b760 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
2b770 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2b780 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2b790 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2b7a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2b7b0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2b7c0 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f  aData;.    cellO
2b7d0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
2b7e0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
2b7f0 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
2b800 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
2b810 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
2b820 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
2b830 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
2b840 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
2b850 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
2b860 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
2b870 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
2b880 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
2b890 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
2b8a0 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
2b8b0 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72  owing two proper
2b8c0 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
2b8d0 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
2b8e0 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
2b8f0 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b   idx >= end+2 );
2b900 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2b910 2b 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42  +sz <= pPage->pB
2b920 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2b930 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
2b940 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
2b950 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
2b960 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
2b970 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
2b980 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
2b990 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
2b9a0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2b9b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
2b9c0 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
2b9d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
2b9e0 28 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64 61 74  (j=end, ptr=&dat
2b9f0 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
2ba00 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
2ba10 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
2ba20 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
2ba30 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
2ba40 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
2ba50 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
2ba60 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2ba70 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2ba80 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
2ba90 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  nCell);.#ifndef 
2baa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2bab0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2bac0 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
2bad0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
2bae0 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
2baf0 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
2bb00 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2bb10 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
2bb20 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
2bb30 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
2bb40 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
2bb50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2bb60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2bb70 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2bb80 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2bb90 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pRC);.    }.#end
2bba0 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
2bbb0 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
2bbc0 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
2bbd0 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
2bbe0 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
2bbf0 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
2bc00 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
2bc10 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
2bc20 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
2bc30 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
2bc40 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2bc50 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
2bc60 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
2bc70 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
2bc80 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2bc90 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2bca0 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
2bcb0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2bcc0 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
2bcd0 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
2bce0 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
2bcf0 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
2bd00 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
2bd10 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
2bd20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2bd30 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2bd40 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20    u8 *pCellptr; 
2bd50 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2bd60 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
2bd70 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
2bd80 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
2bd90 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2bda0 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
2bdb0 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
2bdc0 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
2bdd0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2bde0 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
2bdf0 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2be00 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
2be10 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
2be20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2be30 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
2be40 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
2be50 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61  nt nUsable = pPa
2be60 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2be70 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73  ize; /* Usable s
2be80 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a  ize of page */..
2be90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bea0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2beb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2bec0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2bed0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2bee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
2bef0 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c  ell>=0 && nCell<
2bf00 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
2bf10 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
2bf20 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
2bf30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2bf40 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2bf50 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2bf60 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
2bf70 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
2bf80 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  age has just bee
2bf90 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f  n zeroed by zero
2bfa0 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65  Page() */.  asse
2bfb0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2bfc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2bfd0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2bfe0 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65  hdr+5])==nUsable
2bff0 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20   );..  pCellptr 
2c000 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
2c010 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
2c020 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
2c030 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
2c040 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
2c050 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65  0; i--){.    pCe
2c060 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
2c070 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a  cellbody -= aSiz
2c080 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79  e[i];.    put2by
2c090 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2c0a0 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2c0b0 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2c0c0 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
2c0d0 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Size[i]);.  }.  
2c0e0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2c0f0 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
2c100 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2c110 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79  hdr+5], cellbody
2c120 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2c130 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20  e -= (nCell*2 + 
2c140 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f  nUsable - cellbo
2c150 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  dy);.  pPage->nC
2c160 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
2c170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
2c180 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
2c190 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
2c1a0 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
2c1b0 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
2c1c0 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
2c1d0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2c1e0 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
2c1f0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
2c200 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
2c210 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
2c220 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
2c230 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
2c240 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
2c250 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
2c260 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
2c270 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
2c280 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
2c290 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
2c2a0 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
2c2b0 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
2c2c0 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
2c2d0 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
2c2e0 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
2c2f0 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
2c300 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
2c310 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
2c320 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
2c330 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
2c340 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
2c350 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
2c360 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
2c370 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
2c380 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
2c390 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
2c3a0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
2c3b0 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
2c3c0 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
2c3d0 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
2c3e0 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
2c3f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c400 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2c410 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
2c420 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
2c430 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
2c440 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
2c450 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
2c460 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  ance */...#ifnde
2c470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
2c480 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
2c490 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
2c4a0 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
2c4b0 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
2c4c0 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2c4d0 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
2c4e0 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
2c4f0 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
2c500 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
2c510 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
2c520 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
2c530 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
2c540 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
2c550 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
2c560 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
2c570 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
2c580 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74  ing to balance t
2c590 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
2c5a0 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
2c5b0 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
2c5c0 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
2c5d0 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
2c5e0 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
2c5f0 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
2c600 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
2c610 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
2c620 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
2c630 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
2c640 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
2c650 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
2c660 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
2c670 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
2c680 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
2c690 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
2c6a0 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
2c6b0 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
2c6c0 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
2c6d0 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
2c6e0 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
2c6f0 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
2c700 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
2c710 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
2c720 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
2c730 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
2c740 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
2c750 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
2c760 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
2c770 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2c780 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
2c790 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70  e..**.** The pSp
2c7a0 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73  ace buffer is us
2c7b0 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65  ed to store a te
2c7c0 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20  mporary copy of 
2c7d0 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63  the divider.** c
2c7e0 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
2c7f0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70   inserted into p
2c800 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63  Parent. Such a c
2c810 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
2c820 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65  a 4.** byte page
2c830 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64   number followed
2c840 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c   by a variable l
2c850 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49  ength integer. I
2c860 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
2c870 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74  , at most 13 byt
2c880 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53  es. Hence the pS
2c890 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74  pace buffer must
2c8a0 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20   be at.** least 
2c8b0 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
2c8c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c8d0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
2c8e0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2c8f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2c900 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42  u8 *pSpace){.  B
2c910 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70  tShared *const p
2c920 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2c930 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61      /* B-Tree Da
2c940 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50  tabase */.  MemP
2c950 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  age *pNew;      
2c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c970 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
2c980 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ted page */.  in
2c990 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2c9c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2c9d0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2c9f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e  age number of pN
2ca00 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ew */..  assert(
2ca10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2ca20 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2ca30 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2ca40 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2ca50 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2ca60 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2ca70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ca80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
2ca90 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ;..  if( pPage->
2caa0 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72  nCell<=0 ) retur
2cab0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2cac0 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _BKPT;..  /* All
2cad0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2cae0 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c  . This page will
2caf0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68   become the righ
2cb00 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20  t-sibling of .  
2cb10 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74  ** pPage. Make t
2cb20 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
2cb30 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74  ritable, so that
2cb40 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
2cb50 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62   cell.  ** may b
2cb60 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62  e inserted. If b
2cb70 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74  oth these operat
2cb80 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
2cb90 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20  ful, proceed..  
2cba0 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
2cbb0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2cbc0 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
2cbd0 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20  , 0, 0);..  if( 
2cbe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cbf0 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
2cc00 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
2cc10 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
2cc20 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
2cc30 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  ll;.    u16 szCe
2cc40 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
2cc50 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2cc60 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
2cc70 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2cc80 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2cc90 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
2cca0 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
2ccb0 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
2ccc0 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
2ccd0 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
2cce0 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
2ccf0 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
2cd00 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2cd10 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
2cd20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
2cd30 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
2cd40 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20   &szCell);..    
2cd50 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2cd60 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2cd70 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2cd80 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
2cd90 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
2cda0 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
2cdb0 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
2cdc0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
2cdd0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
2cde0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
2cdf0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
2ce00 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
2ce10 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
2ce20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
2ce30 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
2ce40 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
2ce50 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
2ce60 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
2ce70 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
2ce80 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
2ce90 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
2cea0 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
2ceb0 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
2cec0 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
2ced0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
2cee0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2cef0 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
2cf00 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
2cf10 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
2cf20 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
2cf30 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
2cf40 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2cf50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2cf60 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2cf70 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
2cf80 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
2cf90 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
2cfa0 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
2cfb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
2cfc0 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
2cfd0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  al ){.        pt
2cfe0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2cff0 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  New, pCell, &rc)
2d000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d010 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65    .    /* Create
2d020 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
2d030 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70  to insert into p
2d040 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69  Parent. The divi
2d050 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20  der cell.    ** 
2d060 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d  consists of a 4-
2d070 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
2d080 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (the page numbe
2d090 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a  r of pPage) and.
2d0a0 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c      ** a variabl
2d0b0 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c  e length key val
2d0c0 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  ue (which must b
2d0d0 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
2d0e0 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   as the.    ** l
2d0f0 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50  argest key on pP
2d100 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  age)..    **.   
2d110 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20   ** To find the 
2d120 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75  largest key valu
2d130 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73  e on pPage, firs
2d140 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74  t find the right
2d150 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65  -most .    ** ce
2d160 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65  ll on pPage. The
2d170 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64   first two field
2d180 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61  s of this cell a
2d190 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  re the .    ** r
2d1a0 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20  ecord-length (a 
2d1b0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2d1c0 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20  integer at most 
2d1d0 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29  32-bits in size)
2d1e0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
2d1f0 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72  key value (a var
2d200 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2d210 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61  eger, may have a
2d220 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a  ny value)..    *
2d230 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74  * The first of t
2d240 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  he while(...) lo
2d250 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20  ops below skips 
2d260 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d  over the record-
2d270 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69  length.    ** fi
2d280 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  eld. The second 
2d290 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20  while(...) loop 
2d2a0 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76  copies the key v
2d2b0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  alue from the.  
2d2c0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
2d2d0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61  ge into the pSpa
2d2e0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  ce buffer..    *
2d2f0 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  /.    pCell = fi
2d300 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
2d310 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
2d320 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
2d330 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
2d340 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38   (*(pCell++)&0x8
2d350 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
2d360 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  p );.    pStop =
2d370 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
2d380 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b  while( ((*(pOut+
2d390 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29  +) = *(pCell++))
2d3a0 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
2d3b0 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  pStop );..    /*
2d3c0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
2d3d0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
2d3e0 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
2d3f0 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
2d400 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e  rent, pParent->n
2d410 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69  Cell, pSpace, (i
2d420 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29  nt)(pOut-pSpace)
2d430 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d440 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c   0, pPage->pgno,
2d450 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   &rc);..    /* S
2d460 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  et the right-chi
2d470 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50  ld pointer of pP
2d480 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74  arent to point t
2d490 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
2d4a0 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
2d4b0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2d4c0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2d4d0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
2d4e0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  .  .    /* Relea
2d4f0 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
2d500 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2d510 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65  . */.    release
2d520 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  Page(pNew);.  }.
2d530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d540 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d550 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
2d560 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a  CE */..#if 0./*.
2d570 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2d580 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2d590 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f  bute anything to
2d5a0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
2d5b0 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20  f SQLite..** it 
2d5c0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74  is sometimes act
2d5d0 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69  ivated temporari
2d5e0 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69  ly while debuggi
2d5f0 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69  ng code responsi
2d600 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74  ble .** for sett
2d610 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  ing pointer-map 
2d620 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
2d630 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65  ic int ptrmapChe
2d640 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ckPages(MemPage 
2d650 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50  **apPage, int nP
2d660 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  age){.  int i, j
2d670 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2d680 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
2d690 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65  Pgno n;.    u8 e
2d6a0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2d6b0 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d  Page = apPage[i]
2d6c0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
2d6d0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2d6e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2d6f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2d700 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2d710 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b  Page->nCell; j++
2d720 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  ){.      CellInf
2d730 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38  o info;.      u8
2d740 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20   *z;.     .     
2d750 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50   z = findCell(pP
2d760 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62  age, j);.      b
2d770 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2d780 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f  (pPage, z, &info
2d790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66  );.      if( inf
2d7a0 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
2d7b0 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c         Pgno ovfl
2d7c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69   = get4byte(&z[i
2d7d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
2d7e0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
2d7f0 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65  et(pBt, ovfl, &e
2d800 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
2d810 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2d820 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2d830 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a  AP_OVERFLOW1 );.
2d840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2d850 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2d860 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63  {.        Pgno c
2d870 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2d880 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  z);.        ptrm
2d890 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
2d8a0 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2d8b0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2d8c0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2d8d0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
2d8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d8f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2d900 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
2d910 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2d920 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2d930 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2d940 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  +8]);.      ptrm
2d950 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
2d960 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2d970 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2d980 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2d990 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
2d9a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2d9b0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
2d9c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d9d0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70  n is used to cop
2d9e0 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
2d9f0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  f the b-tree nod
2da00 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20  e stored .** on 
2da10 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
2da20 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20  ge pTo. If page 
2da30 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20  pFrom was not a 
2da40 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a  leaf page, then.
2da50 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
2da60 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65  ap entries for e
2da70 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61  ach child page a
2da80 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  re updated so th
2da90 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74  at the.** parent
2daa0 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20   page stored in 
2dab0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2dac0 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  is page pTo. If 
2dad0 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a  pFrom contained.
2dae0 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74  ** any cells wit
2daf0 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
2db00 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74  pointers, then t
2db10 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2db20 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
2db30 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f  entries are also
2db40 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
2db50 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2db60 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a   is page pTo..**
2db70 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20  .** If pFrom is 
2db80 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69  currently carryi
2db90 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ng any overflow 
2dba0 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69  cells (entries i
2dbb0 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65  n the.** MemPage
2dbc0 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c  .aOvfl[] array),
2dbd0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f   they are not co
2dbe0 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a  pied to pTo. .**
2dbf0 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
2dc00 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69  ning, page pTo i
2dc10 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  s reinitialized 
2dc20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50  using btreeInitP
2dc30 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  age()..**.** The
2dc40 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
2dc50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2dc60 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49   not critical. I
2dc70 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
2dc80 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63  y .** the balanc
2dc90 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e  e_shallower() an
2dca0 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  d balance_deeper
2dcb0 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e  () procedures, n
2dcc0 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69  either of.** whi
2dcd0 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66  ch are called of
2dce0 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c  ten under normal
2dcf0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a   circumstances..
2dd00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2dd10 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d  opyNodeContent(M
2dd20 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d  emPage *pFrom, M
2dd30 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74  emPage *pTo, int
2dd40 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
2dd50 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
2dd60 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
2dd70 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46  * const pBt = pF
2dd80 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38  rom->pBt;.    u8
2dd90 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d   * const aFrom =
2dda0 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20   pFrom->aData;. 
2ddb0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54     u8 * const aT
2ddc0 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a  o = pTo->aData;.
2ddd0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46      int const iF
2dde0 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e  romHdr = pFrom->
2ddf0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  hdrOffset;.    i
2de00 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20  nt const iToHdr 
2de10 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31  = ((pTo->pgno==1
2de20 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20  ) ? 100 : 0);.  
2de30 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
2de40 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20  t iData;.  .  . 
2de50 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2de60 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2de70 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e  assert( pFrom->n
2de80 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a  Free>=iToHdr );.
2de90 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
2dea0 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2deb0 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75  mHdr+5])<=pBt->u
2dec0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a  sableSize );.  .
2ded0 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2dee0 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74  b-tree node cont
2def0 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46  ent from page pF
2df00 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2df10 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20   */.    iData = 
2df20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
2df30 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20  iFromHdr+5]);.  
2df40 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
2df50 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
2df60 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
2df70 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20  Size-iData);.   
2df80 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
2df90 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
2dfa0 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
2dfb0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
2dfc0 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a  rom->nCell);.  .
2dfd0 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c      /* Reinitial
2dfe0 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
2dff0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2e000 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
2e010 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
2e020 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
2e030 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
2e040 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
2e050 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69  can actually fai
2e060 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66  l under.    ** f
2e070 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69  airly obscure ci
2e080 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65  rcumstances, eve
2e090 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61  n though it is a
2e0a0 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   copy of initial
2e0b0 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67  ized .    ** pag
2e0c0 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a  e pFrom..    */.
2e0d0 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20      pTo->isInit 
2e0e0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  = 0;.    rc = bt
2e0f0 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29  reeInitPage(pTo)
2e100 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e120 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2e130 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2e140 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
2e150 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2e160 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
2e170 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2e180 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20  -map entries.   
2e190 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72   ** for any b-tr
2e1a0 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ee or overflow p
2e1b0 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f  ages that pTo no
2e1c0 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  w contains the p
2e1d0 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20  ointers to..    
2e1e0 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2e1f0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2e200 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64   *pRC = setChild
2e210 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20  Ptrmaps(pTo);.  
2e220 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2e230 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2e240 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c  distributes cell
2e250 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74  s on the iParent
2e260 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20  Idx'th child of 
2e270 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65  pParent.** (here
2e280 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22  after "the page"
2e290 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69  ) and up to 2 si
2e2a0 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61  blings so that a
2e2b0 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
2e2c0 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  out the.** same 
2e2d0 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
2e2e0 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20  pace. Usually a 
2e2f0 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f  single sibling o
2e300 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
2e310 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65   the.** page are
2e320 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
2e330 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62  ancing, though b
2e340 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  oth siblings mig
2e350 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
2e360 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20  .** side if the 
2e370 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  page is the firs
2e380 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  t or last child 
2e390 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49  of its parent. I
2e3a0 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68  f the page .** h
2e3b0 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20  as fewer than 2 
2e3c0 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68  siblings (someth
2e3d0 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
2e3e0 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2e3f0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f   page.** is a ro
2e400 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69  ot page or a chi
2e410 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67  ld of a root pag
2e420 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  e) then all avai
2e430 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a  lable siblings.*
2e440 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  * participate in
2e450 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
2e460 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
2e470 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
2e480 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62  the page might b
2e490 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
2e4a0 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20  ecreased by .** 
2e4b0 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e  one or two in an
2e4c0 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
2e4d0 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c  pages nearly ful
2e4e0 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66  l but not over f
2e4f0 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ull. .**.** Note
2e500 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
2e510 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2e520 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  d, some of the c
2e530 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
2e540 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  .** might not ac
2e550 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64  tually be stored
2e560 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74   in MemPage.aDat
2e570 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61  a[]. This can ha
2e580 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70  ppen.** if the p
2e590 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  age is overfull.
2e5a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
2e5b0 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63  sures that all c
2e5c0 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  ells allocated.*
2e5d0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  * to the page an
2e5e0 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66  d its siblings f
2e5f0 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e  it into MemPage.
2e600 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72  aData[] before r
2e610 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
2e620 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
2e630 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70   balancing the p
2e640 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
2e650 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20  ings, cells may 
2e660 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  be.** inserted i
2e670 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66  nto or removed f
2e680 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2e690 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44  age (pParent). D
2e6a0 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63  oing so.** may c
2e6b0 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20  ause the parent 
2e6c0 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f  page to become o
2e6d0 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
2e6e0 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a  full. If this.**
2e6f0 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20   happens, it is 
2e700 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
2e710 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
2e720 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63   to invoke the c
2e730 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63  orrect.** balanc
2e740 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  ing routine to f
2e750 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ix this problem 
2e760 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65  (see the balance
2e770 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a  () routine). .**
2e780 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
2e790 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  ine fails for an
2e7a0 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67  y reason, it mig
2e7b0 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  ht leave the dat
2e7c0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f  abase.** in a co
2e7d0 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53  rrupted state. S
2e7e0 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
2e7f0 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
2e800 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
2e810 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
2e820 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20  **.** The third 
2e830 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2e840 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c   function, aOvfl
2e850 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e  Space, is a poin
2e860 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66  ter to a.** buff
2e870 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  er big enough to
2e880 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20   hold one page. 
2e890 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69  If while inserti
2e8a0 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  ng cells into th
2e8b0 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65  e parent.** page
2e8c0 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70   (pParent) the p
2e8d0 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d  arent page becom
2e8e0 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69  es overfull, thi
2e8f0 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75  s buffer is.** u
2e900 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
2e910 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c   parent's overfl
2e920 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73  ow cells. Becaus
2e930 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
2e940 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78  inserts.** a max
2e950 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76  imum of four div
2e960 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
2e970 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
2e980 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
2e990 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65  .** size of a ce
2e9a0 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ll stored within
2e9b0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   an internal nod
2e9c0 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73  e is always less
2e9d0 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20   than 1/4.** of 
2e9e0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74  the page-size, t
2e9f0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20  he aOvflSpace[] 
2ea00 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e  buffer is guaran
2ea10 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  teed to be large
2ea20 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  .** enough for a
2ea30 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ll overflow cell
2ea40 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66  s..**.** If aOvf
2ea50 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f  lSpace is set to
2ea60 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c   a null pointer,
2ea70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2ea80 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
2ea90 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
2eaa0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
2eab0 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67  onroot(.  MemPag
2eac0 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
2ead0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2eae0 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c  ent page of sibl
2eaf0 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ings being balan
2eb00 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ced */.  int iPa
2eb10 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20  rentIdx,        
2eb20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2eb30 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20  x of "the page" 
2eb40 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
2eb50 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20  u8 *aOvflSpace, 
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb70 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74  /* page-size byt
2eb80 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
2eb90 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20  parent ovfl */. 
2eba0 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20   int isRoot     
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebc0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
2ebd0 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  ent is a root-pa
2ebe0 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  ge */.){.  BtSha
2ebf0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2ec00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
2ec10 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
2ec20 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
2ec30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ec40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
2ec50 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
2ec60 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
2ec70 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2ec80 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
2ec90 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
2eca0 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
2ecb0 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20    int nNew = 0; 
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ecd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2ece0 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
2ecf0 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20    int nOld;     
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ed10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2ed20 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
2ed30 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
2ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ed50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2ed60 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20  */.  int nxDiv; 
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed80 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65    /* Next divide
2ed90 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e  r slot in pParen
2eda0 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
2edb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2edc0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
2edd0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
2ede0 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72  */.  u16 leafCor
2edf0 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rection;        
2ee00 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20    /* 4 if pPage 
2ee10 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
2ee20 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   not */.  int le
2ee30 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
2ee40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2ee50 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2ee60 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20  f of a LEAFDATA 
2ee70 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  tree */.  int us
2ee80 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20  ableSpace;      
2ee90 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2eea0 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20  in pPage beyond 
2eeb0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
2eec0 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20  int pageFlags;  
2eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eee0 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e  Value of pPage->
2eef0 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e  aData[0] */.  in
2ef00 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20  t subtotal;     
2ef10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
2ef20 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20  btotal of bytes 
2ef30 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20  in cells on one 
2ef40 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  page */.  int iS
2ef50 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20  pace1 = 0;      
2ef60 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2ef70 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
2ef80 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e  Space1[] */.  in
2ef90 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30  t iOvflSpace = 0
2efa0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2efb0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
2efc0 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20  of aOvflSpace[] 
2efd0 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74  */.  int szScrat
2efe0 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
2eff0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72    /* Size of scr
2f000 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75  atch memory requ
2f010 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  ested */.  MemPa
2f020 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20  ge *apOld[NB];  
2f030 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
2f040 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73   and up to two s
2f050 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d  iblings */.  Mem
2f060 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
2f070 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
2f080 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
2f090 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
2f0a0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
2f0b0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
2f0c0 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
2f0d0 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
2f0e0 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
2f0f0 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20  .  u8 *pRight;  
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f110 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70  /* Location in p
2f120 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73  arent of right-s
2f130 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a  ibling pointer *
2f140 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
2f150 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  -1];            
2f160 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
2f170 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
2f180 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
2f190 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
2f1a0 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
2f1b0 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
2f1c0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
2f1d0 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
2f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f1f0 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
2f200 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
2f210 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
2f220 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
2f230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2f240 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
2f250 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
2f260 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
2f270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
2f280 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
2f290 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2f2a0 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
2f2b0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2f2c0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
2f2d0 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65  copies of divide
2f2e0 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67  rs cells */.  Pg
2f2f0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
2f300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2f310 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20  mp var to store 
2f320 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  a page number in
2f330 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61   */..  pBt = pPa
2f340 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73  rent->pBt;.  ass
2f350 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f360 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2f370 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2f380 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2f390 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
2f3a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23  ->pDbPage) );..#
2f3b0 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42  if 0.  TRACE(("B
2f3c0 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
2f3d0 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
2f3e0 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2f3f0 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
2f400 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ));.#endif..  /*
2f410 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
2f420 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20  Parent may have 
2f430 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72  at most one over
2f440 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69  flow cell. And i
2f450 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72  f.  ** this over
2f460 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65  flow cell is pre
2f470 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sent, it must be
2f480 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a   the cell with .
2f490 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65    ** index iPare
2f4a0 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e  ntIdx. This scen
2f4b0 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74  ario comes about
2f4c0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2f4d0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ion.  ** is call
2f4e0 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20  ed (indirectly) 
2f4f0 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65  from sqlite3Btre
2f500 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a  eDelete()..  */.
2f510 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2f520 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2f530 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  || pParent->nOve
2f540 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73  rflow==1 );.  as
2f550 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e  sert( pParent->n
2f560 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70  Overflow==0 || p
2f570 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d  Parent->aOvfl[0]
2f580 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78  .idx==iParentIdx
2f590 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
2f5a0 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
2f5b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f5c0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
2f5d0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
2f5e0 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
2f5f0 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
2f600 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2f610 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
2f620 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
2f630 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
2f640 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
2f650 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
2f660 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2f670 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
2f680 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
2f690 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
2f6a0 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
2f6b0 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
2f6c0 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
2f6d0 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
2f6e0 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
2f6f0 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
2f700 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
2f710 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
2f720 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
2f730 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
2f740 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
2f750 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
2f760 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
2f770 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
2f780 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
2f790 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
2f7a0 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
2f7b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
2f7c0 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
2f7d0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
2f7e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2f7f0 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65  , since if any e
2f800 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c  xisted they will
2f810 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61  .  ** have alrea
2f820 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  dy been removed.
2f830 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72  .  */.  i = pPar
2f840 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b  ent->nOverflow +
2f850 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
2f860 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20  .  if( i<2 ){.  
2f870 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20    nxDiv = 0;.   
2f880 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d   nOld = i+1;.  }
2f890 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d  else{.    nOld =
2f8a0 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72   3;.    if( iPar
2f8b0 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20  entIdx==0 ){    
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
2f8d0 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
2f8e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61     }else if( iPa
2f8f0 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20  rentIdx==i ){.  
2f900 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b      nxDiv = i-2;
2f910 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f920 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e    nxDiv = iParen
2f930 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  tIdx-1;.    }.  
2f940 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69    i = 2;.  }.  i
2f950 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72  f( (i+nxDiv-pPar
2f960 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d  ent->nOverflow)=
2f970 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
2f980 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ){.    pRight = 
2f990 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2f9a0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2f9b0 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et+8];.  }else{.
2f9c0 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e      pRight = fin
2f9d0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
2f9e0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
2f9f0 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a  nOverflow);.  }.
2fa00 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2fa10 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69  e(pRight);.  whi
2fa20 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20  le( 1 ){.    rc 
2fa30 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2fa40 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f  (pBt, pgno, &apO
2fa50 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
2fa60 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  rc ){.      mems
2fa70 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b  et(apOld, 0, (i+
2fa80 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  1)*sizeof(MemPag
2fa90 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e*));.      goto
2faa0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2fab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
2fac0 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
2fad0 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
2fae0 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
2faf0 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30      if( (i--)==0
2fb00 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69   ) break;..    i
2fb10 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72  f( i+nxDiv==pPar
2fb20 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  ent->aOvfl[0].id
2fb30 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  x && pParent->nO
2fb40 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
2fb50 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72   apDiv[i] = pPar
2fb60 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  ent->aOvfl[0].pC
2fb70 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ell;.      pgno 
2fb80 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
2fb90 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
2fba0 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
2fbb0 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
2fbc0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61  v[i]);.      pPa
2fbd0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
2fbe0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
2fbf0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
2fc00 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
2fc10 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
2fc20 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
2fc30 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
2fc40 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
2fc50 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
2fc60 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2fc70 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
2fc80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70  ;..      /* Drop
2fc90 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
2fca0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2fcb0 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70  apDiv[i] still p
2fcc0 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  oints to.      *
2fcd0 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  * the cell withi
2fce0 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76  n the parent, ev
2fcf0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73  en though it has
2fd00 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20   been dropped.. 
2fd10 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
2fd20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f  safe because dro
2fd30 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c  pping a cell onl
2fd40 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  y overwrites the
2fd50 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
2fd60 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74  four bytes of it
2fd70 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
2fd80 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
2fd90 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  d the first.    
2fda0 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
2fdb0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
2fdc0 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e  ell. So the poin
2fdd0 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75  ter is safe to u
2fde0 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65  se.      ** late
2fdf0 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a  r on.  .      **
2fe00 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
2fe10 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
2fe20 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65  led in secure-de
2fe30 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68  lete mode. In th
2fe40 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a  is case,.      *
2fe50 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29  * the dropCell()
2fe60 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76   routine will ov
2fe70 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69  erwrite the enti
2fe80 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72  re cell with zer
2fe90 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  oes..      ** In
2fea0 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70   this case, temp
2feb0 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65  orarily copy the
2fec0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61   cell into the a
2fed0 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20  OvflSpace[].    
2fee0 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20    ** buffer. It 
2fef0 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f  will be copied o
2ff00 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e  ut again as soon
2ff10 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d   as the aSpace[]
2ff20 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a   buffer.      **
2ff30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   is allocated.  
2ff40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
2ff50 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29  ->secureDelete )
2ff60 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
2ff70 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ff = SQLITE_PTR_
2ff80 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29  TO_INT(apDiv[i])
2ff90 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   - SQLITE_PTR_TO
2ffa0 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44  _INT(pParent->aD
2ffb0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
2ffc0 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d  ( (iOff+szNew[i]
2ffd0 29 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )>pBt->usableSiz
2ffe0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
2fff0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
30000 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
30010 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c     memset(apOld,
30020 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66   0, (i+1)*sizeof
30030 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
30040 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
30050 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
30060 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30070 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f        memcpy(&aO
30080 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20  vflSpace[iOff], 
30090 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b  apDiv[i], szNew[
300a0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  i]);.          a
300b0 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c  pDiv[i] = &aOvfl
300c0 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70  Space[apDiv[i]-p
300d0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a  Parent->aData];.
300e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
300f0 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  }.      dropCell
30100 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
30110 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
30120 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20  flow, szNew[i], 
30130 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
30140 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
30150 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
30160 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
30170 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
30180 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
30190 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
301a0 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
301b0 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
301c0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
301d0 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
301e0 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20  ures.  */.  k = 
301f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
30200 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
30210 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72  mPage));.  szScr
30220 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
30230 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
30240 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
30250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
30260 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
30270 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
30280 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
30290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
302a0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  ell */.     + pB
302b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20  t->pageSize     
302c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
302e0 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b  ace1 */.     + k
302f0 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  *nOld;          
30300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
30320 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70  ge copies (apCop
30330 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  y) */.  apCell =
30340 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
30350 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
30360 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
30370 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
30380 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
30390 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
303a0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
303b0 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
303c0 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
303d0 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75  ;.  aSpace1 = (u
303e0 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
303f0 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
30400 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
30410 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29  NMENT(aSpace1) )
30420 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  ;..  /*.  ** Loa
30430 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
30440 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
30450 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
30460 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
30470 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
30480 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
30490 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
304a0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
304b0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
304c0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
304d0 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64  om aSpace1[] and
304e0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
304f0 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
30500 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
30510 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
30520 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
30530 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
30540 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
30550 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
30560 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
30570 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
30580 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
30590 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
305a0 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
305b0 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73  ace1[].  In this
305c0 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
305d0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20  in apCell[] are 
305e0 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69  without.  ** chi
305f0 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66  ld pointers.  If
30600 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
30610 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61  t leaves, then a
30620 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20  ll cell in.  ** 
30630 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65  apCell[] include
30640 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
30650 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c    Either way, al
30660 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
30670 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69  l[].  ** are ali
30680 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65  ke..  **.  ** le
30690 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34  afCorrection:  4
306a0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
306b0 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65  eaf.  0 if pPage
306c0 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a   is not a leaf..
306d0 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44    **       leafD
306e0 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65  ata:  1 if pPage
306f0 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20   holds key+data 
30700 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64  and pParent hold
30710 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a  s only keys..  *
30720 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  /.  leafCorrecti
30730 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c  on = apOld[0]->l
30740 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
30750 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61  a = apOld[0]->ha
30760 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30  sData;.  for(i=0
30770 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
30780 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20      int limit;. 
30790 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72     .    /* Befor
307a0 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
307b0 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f   else, take a co
307c0 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f  py of the i'th o
307d0 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a  riginal sibling.
307e0 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20      ** The rest 
307f0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
30800 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
30810 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
30820 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  ather.    ** tha
30830 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
30840 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
30850 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
30860 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20  ll be in the.   
30870 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
30880 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
30890 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
308a0 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
308b0 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
308c0 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61  &aSpace1[pBt->pa
308d0 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20  geSize + k*i];. 
308e0 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20     memcpy(pOld, 
308f0 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
30900 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
30910 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76  pOld->aData = (v
30920 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20  oid*)&pOld[1];. 
30930 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e     memcpy(pOld->
30940 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
30950 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
30960 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d  eSize);..    lim
30970 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
30980 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
30990 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
309a0 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
309b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
309c0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
309d0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
309e0 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
309f0 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
30a00 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
30a10 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
30a20 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
30a30 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43  Cell]);.      nC
30a40 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
30a50 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26   if( i<nOld-1 &&
30a60 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20   !leafData){.   
30a70 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36     u16 sz = (u16
30a80 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  )szNew[i];.     
30a90 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
30aa0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
30ab0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
30ac0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
30ad0 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65   = sz;.      pTe
30ae0 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53  mp = &aSpace1[iS
30af0 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53  pace1];.      iS
30b00 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace1 += sz;.   
30b10 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
30b20 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
30b30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30b40 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61  iSpace1<=pBt->pa
30b50 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
30b60 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
30b70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
30b80 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
30b90 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
30ba0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61  rection;.      a
30bb0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
30bc0 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66  ction==0 || leaf
30bd0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
30be0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
30bf0 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43  ell] = szCell[nC
30c00 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65  ell] - leafCorre
30c10 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  ction;.      if(
30c20 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
30c30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30c40 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
30c50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
30c60 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66  ert( pOld->hdrOf
30c70 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  fset==0 );.     
30c80 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
30c90 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
30ca0 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
30cb0 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
30cc0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
30cd0 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
30ce0 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
30cf0 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
30d00 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
30d10 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20  Data[8], 4);.   
30d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30d30 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
30d40 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
30d50 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
30d60 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
30d70 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
30d80 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
30d90 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
30da0 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
30db0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
30dc0 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l] = 4;.        
30dd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30de0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
30df0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
30e00 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
30e10 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
30e20 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
30e30 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
30e40 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
30e50 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
30e60 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
30e70 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
30e80 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
30e90 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
30ea0 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
30eb0 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
30ec0 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
30ed0 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
30ee0 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
30ef0 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
30f00 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
30f10 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
30f20 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
30f30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
30f40 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
30f50 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
30f60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
30f70 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
30f80 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
30f90 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
30fa0 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
30fb0 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
30fc0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
30fd0 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
30fe0 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
30ff0 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
31000 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
31010 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
31020 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
31030 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
31040 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
31050 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
31060 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
31070 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
31080 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
31090 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
310a0 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
310b0 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
310c0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
310d0 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
310e0 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
310f0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
31100 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
31110 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
31120 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
31130 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
31140 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
31150 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
31160 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
31170 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
31180 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
31190 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
311a0 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
311b0 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
311c0 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20       k++;.      
311d0 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63  if( k>NB+1 ){ rc
311e0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
311f0 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c  T_BKPT; goto bal
31200 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a  ance_cleanup; }.
31210 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
31220 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
31230 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
31240 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
31250 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
31260 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
31270 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
31280 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
31290 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
312a0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
312b0 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
312c0 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
312d0 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
312e0 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
312f0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
31300 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
31310 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
31320 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
31330 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
31340 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
31350 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
31360 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
31370 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
31380 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
31390 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
313a0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
313b0 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
313c0 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
313d0 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
313e0 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
313f0 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
31400 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
31410 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
31420 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
31430 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
31440 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
31450 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
31460 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
31470 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
31480 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
31490 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
314a0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
314b0 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
314c0 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
314d0 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
314e0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
314f0 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
31500 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
31510 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
31520 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
31530 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
31540 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
31550 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
31560 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
31570 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
31580 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
31590 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
315a0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
315b0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
315c0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
315d0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
315e0 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
315f0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
31600 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
31610 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
31620 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
31630 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
31640 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
31650 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
31660 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
31670 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
31680 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
31690 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
316a0 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
316b0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
316c0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
316d0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
316e0 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
316f0 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
31700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
31710 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
31720 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
31730 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70  tnew[0])>0) or p
31740 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76  Page is.  ** a v
31750 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
31760 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
31770 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
31780 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
31790 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
317a0 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
317b0 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
317c0 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
317d0 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
317e0 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
317f0 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
31800 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
31810 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  ;..  TRACE(("BAL
31820 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
31830 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c   %d  ",.    apOl
31840 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20  d[0]->pgno, .   
31850 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64   nOld>=2 ? apOld
31860 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20  [1]->pgno : 0,. 
31870 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f     nOld>=3 ? apO
31880 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a  ld[2]->pgno : 0.
31890 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a    ));..  /*.  **
318a0 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
318b0 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
318c0 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
318d0 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  ssible..  */.  i
318e0 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e  f( apOld[0]->pgn
318f0 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  o<=1 ){.    rc =
31900 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31910 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62  BKPT;.    goto b
31920 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
31930 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20    }.  pageFlags 
31940 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74  = apOld[0]->aDat
31950 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
31960 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
31970 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
31980 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
31990 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
319a0 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
319b0 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
319c0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
319d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
319e0 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
319f0 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
31a00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
31a10 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
31a20 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
31a30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
31a40 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
31a50 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
31a60 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
31a70 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b  &pgno, pgno, 0);
31a80 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
31a90 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
31aa0 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
31ab0 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
31ac0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20     nNew++;..    
31ad0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
31ae0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
31af0 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
31b00 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
31b10 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
31b20 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  UM ){.        pt
31b30 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
31b40 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
31b50 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
31b60 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
31b70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31b90 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
31ba0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
31bb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
31bc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
31bd0 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
31be0 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
31bf0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
31c00 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
31c10 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65  <nOld ){.    fre
31c20 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20  ePage(apOld[i], 
31c30 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
31c40 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
31c50 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
31c60 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
31c70 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
31c80 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
31c90 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
31ca0 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
31cb0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
31cc0 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
31cd0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
31ce0 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
31cf0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
31d00 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
31d10 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
31d20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
31d30 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
31d40 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
31d50 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
31d60 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
31d70 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
31d80 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
31d90 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
31da0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
31db0 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
31dc0 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
31dd0 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
31de0 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
31df0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
31e00 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
31e10 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
31e20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
31e30 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
31e40 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
31e50 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
31e60 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
31e70 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
31e80 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
31e90 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
31ea0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
31eb0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
31ec0 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
31ed0 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65   int minV = apNe
31ee0 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
31ef0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
31f00 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
31f10 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
31f20 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  ( apNew[j]->pgno
31f30 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
31f40 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
31f50 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
31f60 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  V = apNew[j]->pg
31f70 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
31f80 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
31f90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
31fa0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
31fb0 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61 70  pT;.      t = ap
31fc0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
31fd0 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
31fe0 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
31ff0 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
32000 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
32010 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
32020 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
32030 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
32040 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
32050 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
32060 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
32070 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
32080 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
32090 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
320a0 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
320b0 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
320c0 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
320d0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
320e0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
320f0 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
32100 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
32110 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
32120 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
32130 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
32140 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
32150 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
32160 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32170 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32180 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
32190 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
321a0 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
321b0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
321c0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
321d0 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
321e0 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
321f0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
32200 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
32210 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
32220 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
32230 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
32240 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
32250 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
32260 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
32270 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
32280 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
32290 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
322a0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
322b0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
322c0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
322d0 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
322e0 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
322f0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
32300 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
32310 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
32320 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
32330 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
32340 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
32350 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
32360 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
32370 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
32380 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
32390 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
323a0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
323b0 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
323c0 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
323d0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
323e0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
323f0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
32400 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
32410 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
32420 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c  sert( i<nNew-1 |
32430 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  | j==nCell );.  
32440 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b    if( j<nCell ){
32450 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
32460 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
32470 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
32480 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
32490 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
324a0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
324b0 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
324c0 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
324d0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
324e0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f       pTemp = &aO
324f0 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70  vflSpace[iOvflSp
32500 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ace];.      if( 
32510 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
32520 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
32530 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
32540 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
32550 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
32560 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
32570 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
32580 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
32590 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
325a0 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
325b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
325c0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
325d0 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
325e0 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
325f0 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
32600 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
32610 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
32620 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
32630 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
32640 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
32650 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
32660 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
32670 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
32680 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
32690 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
326a0 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72  j--;.        btr
326b0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
326c0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
326d0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
326e0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
326f0 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
32700 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
32710 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
32720 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
32730 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
32740 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
32750 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
32760 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
32770 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
32780 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
32790 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
327a0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
327b0 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
327c0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
327d0 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
327e0 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
327f0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
32800 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
32810 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
32820 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
32830 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43  (see btreeParseC
32840 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
32850 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
32860 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
32870 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
32880 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
32890 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
328a0 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
328b0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
328c0 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
328d0 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
328e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
328f0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
32900 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
32910 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
32920 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
32930 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
32940 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
32950 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
32960 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
32970 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
32980 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
32990 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
329a0 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
329b0 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
329c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
329d0 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
329e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
329f0 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
32a00 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
32a10 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
32a20 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
32a30 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
32a40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66      }.      iOvf
32a50 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  lSpace += sz;.  
32a60 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
32a70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
32a80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32a90 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74   iOvflSpace<=pBt
32aa0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
32ab0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
32ac0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
32ad0 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
32ae0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
32af0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
32b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
32b10 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
32b20 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
32b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32b40 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
32b50 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
32b60 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
32b70 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nxDiv++;.    }. 
32b80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
32b90 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
32ba0 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61  t( nOld>0 );.  a
32bb0 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
32bc0 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67  .  if( (pageFlag
32bd0 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30  s & PTF_LEAF)==0
32be0 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69   ){.    u8 *zChi
32bf0 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  ld = &apCopy[nOl
32c00 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a  d-1]->aData[8];.
32c10 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
32c20 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
32c30 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b  [8], zChild, 4);
32c40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f  .  }..  if( isRo
32c50 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  ot && pParent->n
32c60 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
32c70 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61  nt->hdrOffset<=a
32c80 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29  pNew[0]->nFree )
32c90 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
32ca0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
32cb0 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tree now contain
32cc0 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20  s no cells. The 
32cd0 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20  only sibling.   
32ce0 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20   ** page is the 
32cf0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
32d00 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20  he parent. Copy 
32d10 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32d20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
32d30 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
32d40 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e  arent, decreasin
32d50 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65  g the overall he
32d60 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20  ight of the.    
32d70 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ** b-tree struct
32d80 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73  ure by one. This
32d90 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73   is described as
32da0 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68   the "balance-sh
32db0 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20  allower".    ** 
32dc0 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e  sub-algorithm in
32dd0 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74   some documentat
32de0 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ion..    **.    
32df0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  ** If this is an
32e00 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
32e10 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20  abase, the call 
32e20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  to copyNodeConte
32e30 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74  nt() .    ** set
32e40 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  s all pointer-ma
32e50 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
32e60 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62  ponding to datab
32e70 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20  ase image pages 
32e80 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63  .    ** for whic
32e90 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  h the pointer is
32ea0 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
32eb0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
32ec0 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a   copied..    **.
32ed0 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
32ee0 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76  d assert below v
32ef0 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65  erifies that the
32f00 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64   child page is d
32f10 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20  efragmented.    
32f20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20  ** (it must be, 
32f30 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72  as it was just r
32f40 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69  econstructed usi
32f50 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  ng assemblePage(
32f60 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  )). This.    ** 
32f70 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20  is important if 
32f80 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
32f90 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61  happens to be pa
32fa0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
32fb0 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67  base.    ** imag
32fc0 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
32fd0 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20  t( nNew==1 );.  
32fe0 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b    assert( apNew[
32ff0 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20  0]->nFree == .  
33000 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28        (get2byte(
33010 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61  &apNew[0]->aData
33020 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63  [5])-apNew[0]->c
33030 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b  ellOffset-apNew[
33040 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20  0]->nCell*2) .  
33050 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64    );.    copyNod
33060 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30  eContent(apNew[0
33070 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29  ], pParent, &rc)
33080 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  ;.    freePage(a
33090 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20  pNew[0], &rc);. 
330a0 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54   }else if( ISAUT
330b0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f  OVACUUM ){.    /
330c0 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65  * Fix the pointe
330d0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
330e0 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20  r all the cells 
330f0 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65  that were shifte
33100 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a  d around. .    *
33110 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65  * There are seve
33120 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79  ral different ty
33130 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  pes of pointer-m
33140 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ap entries that 
33150 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  need to.    ** b
33160 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
33170 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f  this routine. So
33180 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65  me of these have
33190 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64   been set alread
331a0 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61  y, but.    ** ma
331b0 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65  ny have not. The
331c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
331d0 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a  summary:.    **.
331e0 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20      **   1) The 
331f0 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
33200 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c  ed with new sibl
33210 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77  ing pages that w
33220 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20  ere not.    **  
33230 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65      siblings whe
33240 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
33250 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73  was called. Thes
33260 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
33270 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20     **      been 
33280 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65  set. We don't ne
33290 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75  ed to worry abou
332a0 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74  t old siblings t
332b0 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20  hat were.    ** 
332c0 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68       moved to th
332d0 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68  e free-list - th
332e0 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64  e freePage() cod
332f0 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65  e has taken care
33300 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  .    **      of 
33310 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  those..    **.  
33320 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f    **   2) The po
33330 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
33340 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
33350 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  h the first over
33360 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20  flow.    **     
33370 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
33380 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
33390 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
333a0 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
333b0 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20     **      have 
333c0 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65  also already bee
333d0 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20  n taken care of 
333e0 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
333f0 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  l() code..    **
33400 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20  .    **   3) If 
33410 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
33420 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
33430 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
33440 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a   pages of.    **
33450 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72        cells stor
33460 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e  ed on the siblin
33470 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64  g pages may need
33480 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
33490 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
334a0 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  4) If the siblin
334b0 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
334c0 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
334d0 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a  nodes, then any.
334e0 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72      **      over
334f0 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20  flow pages used 
33500 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d  by these cells m
33510 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
33520 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dated.    **    
33530 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
33540 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
33550 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
33560 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
33570 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
33580 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69  *   5) If the si
33590 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
335a0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
335b0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
335c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74  .    **      ent
335d0 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67  ries for the rig
335e0 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ht-child pages o
335f0 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d  f each sibling m
33600 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20  ay need.    **  
33610 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65      to be update
33620 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
33630 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61   Cases 1 and 2 a
33640 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62  re dealt with ab
33650 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64  ove by other cod
33660 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  e. The next.    
33670 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  ** block deals w
33680 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20  ith cases 3 and 
33690 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66  4 and the one af
336a0 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35  ter that, case 5
336b0 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73  . Since.    ** s
336c0 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  etting a pointer
336d0 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20   map entry is a 
336e0 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e  relatively expen
336f0 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  sive operation, 
33700 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  this.    ** code
33710 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74   only sets point
33720 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
33730 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  or child or over
33740 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
33750 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75  have.    ** actu
33760 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65  ally moved betwe
33770 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20  en pages.  */.  
33780 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
33790 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20  = apNew[0];.    
337a0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
337b0 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69  apCopy[0];.    i
337c0 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  nt nOverflow = p
337d0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
337e0 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64      int iNextOld
337f0 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   = pOld->nCell +
33800 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20   nOverflow;.    
33810 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20  int iOverflow = 
33820 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c  (nOverflow ? pOl
33830 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20  d->aOvfl[0].idx 
33840 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30  : -1);.    j = 0
33850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33870 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73   Current 'old' s
33880 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
33890 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20     k = 0;       
338a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338b0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
338c0 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70   'new' sibling p
338d0 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  age */.    for(i
338e0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
338f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  ){.      int isD
33900 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  ivider = 0;.    
33910 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78    while( i==iNex
33920 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tOld ){.        
33930 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
33940 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
33950 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
33960 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64  last cell on old
33970 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
33980 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74  ing page j. If t
33990 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
339a0 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
339b0 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
339c0 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
339d0 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61  hen cell i was a
339e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a   divider cell. *
339f0 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d  /.        pOld =
33a00 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20   apCopy[++j];.  
33a10 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d        iNextOld =
33a20 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
33a30 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70   pOld->nCell + p
33a40 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
33a50 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
33a60 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
33a70 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c           nOverfl
33a80 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
33a90 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  flow;.          
33aa0 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20  iOverflow = i + 
33ab0 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
33ac0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a  ->aOvfl[0].idx;.
33ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33ae0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c    isDivider = !l
33af0 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20  eafData;  .     
33b00 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
33b10 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  (nOverflow>0 || 
33b20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20  iOverflow<i );. 
33b30 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
33b40 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d  rflow<2 || pOld-
33b50 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
33b60 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
33b70 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x-1);.      asse
33b80 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c  rt(nOverflow<3 |
33b90 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  | pOld->aOvfl[1]
33ba0 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66  .idx==pOld->aOvf
33bb0 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20  l[2].idx-1);.   
33bc0 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66     if( i==iOverf
33bd0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  low ){.        i
33be0 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20  sDivider = 1;.  
33bf0 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76        if( (--nOv
33c00 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20  erflow)>0 ){.   
33c10 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
33c20 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
33c30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33c40 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b   i==cntNew[k] ){
33c50 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
33c60 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
33c70 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
33c80 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
33c90 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20  ll on new.      
33ca0 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
33cb0 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e k. If the sibl
33cc0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
33cd0 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
33ce0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
33cf0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
33d00 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72  l i is a divider
33d10 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   cell.  */.     
33d20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
33d30 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  ++k];.        if
33d40 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f  ( !leafData ) co
33d50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
33d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
33d70 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73  nOld );.      as
33d80 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a  sert( k<nNew );.
33d90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
33da0 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e   cell was origin
33db0 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c  ally divider cel
33dc0 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f  l (and is not no
33dd0 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  w) or.      ** a
33de0 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
33df0 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20   or if the cell 
33e00 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61  was located on a
33e10 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69   different sibli
33e20 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ng.      ** page
33e30 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61   before the bala
33e40 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  ncing, then the 
33e50 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
33e60 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ies associated. 
33e70 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79       ** with any
33e80 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c   child or overfl
33e90 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ow pages need to
33ea0 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f   be updated.  */
33eb0 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76  .      if( isDiv
33ec0 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67  ider || pOld->pg
33ed0 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
33ee0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  {.        if( !l
33ef0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b  eafCorrection ){
33f00 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61  .          ptrma
33f10 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
33f20 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50  te(apCell[i]), P
33f30 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
33f40 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  w->pgno, &rc);. 
33f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33f60 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70   if( szCell[i]>p
33f70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b  New->minLocal ){
33f80 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61  .          ptrma
33f90 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
33fa0 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63  , apCell[i], &rc
33fb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33fc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33fd0 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
33fe0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ion ){.      for
33ff0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
34000 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20  +){.        u32 
34010 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26  key = get4byte(&
34020 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b  apNew[i]->aData[
34030 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  8]);.        ptr
34040 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c  mapPut(pBt, key,
34050 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61   PTRMAP_BTREE, a
34060 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26  pNew[i]->pgno, &
34070 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
34080 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
34090 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b   The ptrmapCheck
340a0 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73  Pages() contains
340b0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
340c0 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79  ents that verify
340d0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c   that.    ** all
340e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
340f0 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65  es are set corre
34100 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65  ctly. This is he
34110 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20  lpful while .   
34120 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54   ** debugging. T
34130 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64  his is usually d
34140 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20  isabled because 
34150 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
34160 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61  se may.    ** ca
34170 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20  use an assert() 
34180 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69  statement to fai
34190 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61  l.  */.    ptrma
341a0 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65  pCheckPages(apNe
341b0 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74  w, nNew);.    pt
341c0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26  rmapCheckPages(&
341d0 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e  pParent, 1);.#en
341e0 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  dif.  }..  asser
341f0 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
34200 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  it );.  TRACE(("
34210 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
34220 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
34230 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
34240 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e          nOld, nN
34250 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20  ew, nCell));..  
34260 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
34270 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
34280 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
34290 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
342a0 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
342b0 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
342c0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
342d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
342e0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
342f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
34300 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
34310 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
34320 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
34330 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
34340 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
34350 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72  alled when the r
34360 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
34370 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
34380 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68  s.** overfull (h
34390 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  as one or more o
343a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a  verflow pages)..
343b0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c  **.** A new chil
343c0 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  d page is alloca
343d0 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ted and the cont
343e0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72  ents of the curr
343f0 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ent root.** page
34400 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72  , including over
34410 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20  flow cells, are 
34420 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
34430 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a  child. The root.
34440 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  ** page is then 
34450 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d  overwritten to m
34460 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20  ake it an empty 
34470 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69  page with the ri
34480 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f  ght-child .** po
34490 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74  inter pointing t
344a0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a  o the new page..
344b0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
344c0 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e  urning, all poin
344d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
344e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
344f0 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20   pages .** that 
34500 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61  the new child-pa
34510 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ge now contains 
34520 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20  pointers to are 
34530 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20  updated. The.** 
34540 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64  entry correspond
34550 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72  ing to the new r
34560 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
34570 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a  er of the root.*
34580 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75  * page is also u
34590 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  pdated..**.** If
345a0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70   successful, *pp
345b0 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
345c0 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65  contain a refere
345d0 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64  nce to the child
345e0 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51   .** page and SQ
345f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
34600 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
34610 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  e the caller is 
34620 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63  required.** to c
34630 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
34640 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78  ) on *ppChild ex
34650 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61  actly once. If a
34660 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
34670 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
34680 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
34690 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
346a0 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
346b0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
346c0 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f  per(MemPage *pRo
346d0 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  ot, MemPage **pp
346e0 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63  Child){.  int rc
346f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34700 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
34710 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
34720 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
34730 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
34740 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
34750 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
34760 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
34770 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
34780 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
34790 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
347a0 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
347b0 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
347c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f  hared *pBt = pRo
347d0 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54  ot->pBt;    /* T
347e0 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61  he BTree */..  a
347f0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f  ssert( pRoot->nO
34800 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61  verflow>0 );.  a
34810 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
34820 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
34830 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  utex) );..  /* M
34840 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72  ake pRoot, the r
34850 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
34860 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65  b-tree, writable
34870 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  . Allocate a new
34880 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74   .  ** page that
34890 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
348a0 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64   new right-child
348b0 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20   of pPage. Copy 
348c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a  the contents.  *
348d0 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74  * of the node st
348e0 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e  ored on pRoot in
348f0 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  to the new child
34900 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   page..  */.  rc
34910 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34920 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
34930 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
34940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34950 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
34960 72 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68  reePage(pBt,&pCh
34970 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70  ild,&pgnoChild,p
34980 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20  Root->pgno,0);. 
34990 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65     copyNodeConte
349a0 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64  nt(pRoot, pChild
349b0 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
349c0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
349d0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
349e0 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
349f0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52  PTRMAP_BTREE, pR
34a00 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  oot->pgno, &rc);
34a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
34a20 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68   rc ){.    *ppCh
34a30 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ild = 0;.    rel
34a40 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
34a50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
34a60 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
34a70 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
34a80 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
34a90 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
34aa0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
34ab0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
34ac0 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
34ad0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
34ae0 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e  ->nCell==pRoot->
34af0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43  nCell );..  TRAC
34b00 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70  E(("BALANCE: cop
34b10 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25  y root %d into %
34b20 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  d\n", pRoot->pgn
34b30 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  o, pChild->pgno)
34b40 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68  );..  /* Copy th
34b50 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  e overflow cells
34b60 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70   from pRoot to p
34b70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70  Child */.  memcp
34b80 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
34b90 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70   pRoot->aOvfl, p
34ba0 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Root->nOverflow*
34bb0 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f  sizeof(pRoot->aO
34bc0 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69  vfl[0]));.  pChi
34bd0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
34be0 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pRoot->nOverflow
34bf0 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
34c00 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f   contents of pRo
34c10 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c  ot. Then install
34c20 20 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72   pChild as the r
34c30 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20  ight-child. */. 
34c40 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
34c50 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
34c60 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a  ] & ~PTF_LEAF);.
34c70 20 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f    put4byte(&pRoo
34c80 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
34c90 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
34ca0 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70  noChild);..  *pp
34cb0 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a  Child = pChild;.
34cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34cd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
34ce0 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20   page that pCur 
34cf0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
34d00 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65   to has just bee
34d10 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a  n modified in.**
34d20 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20   some way. This 
34d30 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73  function figures
34d40 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64   out if this mod
34d50 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20  ification means 
34d60 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64  the.** tree need
34d70 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
34d80 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c  , and if so call
34d90 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  s the appropriat
34da0 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20  e balancing .** 
34db0 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69  routine. Balanci
34dc0 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a  ng routines are:
34dd0 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  .**.**   balance
34de0 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61  _quick().**   ba
34df0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a  lance_deeper().*
34e00 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  *   balance_nonr
34e10 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  oot().*/.static 
34e20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75  int balance(BtCu
34e30 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
34e40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34e50 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  K;.  const int n
34e60 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d  Min = pCur->pBt-
34e70 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20  >usableSize * 2 
34e80 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e  / 3;.  u8 aBalan
34e90 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d  ceQuickSpace[13]
34ea0 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20  ;.  u8 *pFree = 
34eb0 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20  0;..  TESTONLY( 
34ec0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
34ed0 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a  k_called = 0 );.
34ee0 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
34ef0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63  balance_deeper_c
34f00 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20  alled = 0 );..  
34f10 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61  do {.    int iPa
34f20 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
34f30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
34f40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
34f50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20  age[iPage];..   
34f60 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b   if( iPage==0 ){
34f70 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
34f80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
34f90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
34fa0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
34fb0 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c  -tree is overful
34fc0 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  l. In this case 
34fd0 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20  call the.       
34fe0 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70   ** balance_deep
34ff0 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  er() function to
35000 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   create a new ch
35010 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ild for the root
35020 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
35030 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75   and copy the cu
35040 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
35050 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  f the root-page 
35060 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20  to it. The.     
35070 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61     ** next itera
35080 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
35090 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65  oop will balance
350a0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e   the child page.
350b0 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20  .        */ .   
350c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61       assert( (ba
350d0 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c  lance_deeper_cal
350e0 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20  led++)==0 );.   
350f0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
35100 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20  e_deeper(pPage, 
35110 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d  &pCur->apPage[1]
35120 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35140 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
35150 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20  iPage = 1;.     
35160 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
35170 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [0] = 0;.       
35180 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31     pCur->aiIdx[1
35190 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
351a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
351b0 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66  pPage[1]->nOverf
351c0 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  low );.        }
351d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
351e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
351f0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
35200 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
35210 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d  low==0 && pPage-
35220 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a  >nFree<=nMin ){.
35230 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65   }else{.      Me
35250 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50  mPage * const pP
35260 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70  arent = pCur->ap
35270 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20  Page[iPage-1];. 
35280 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69       int const i
35290 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  Idx = pCur->aiId
352a0 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20  x[iPage-1];..   
352b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
352c0 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e  agerWrite(pParen
352d0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
352e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
352f0 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20  E_OK ){.#ifndef 
35300 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
35310 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20  KBALANCE.       
35320 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
35330 61 74 61 0a 20 20 20 20 20 20 20 20 20 26 26 20  ata.         && 
35340 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35350 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==1.         && 
35360 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
35370 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx==pPage->nCel
35380 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  l.         && pP
35390 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20  arent->pgno!=1. 
353a0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
353b0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a  nt->nCell==iIdx.
353c0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
353d0 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c       /* Call bal
353e0 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20  ance_quick() to 
353f0 63 72 65 61 74 65 20 61 20 6e 65 77 20 73 69 62  create a new sib
35400 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e  ling of pPage on
35410 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 20   which.         
35420 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65   ** to store the
35430 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20   overflow cell. 
35440 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
35450 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63 65  inserts a new ce
35460 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
35470 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68  into pParent, wh
35480 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
35490 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20  arent overflow. 
354a0 49 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  If this.        
354b0 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68    ** happens, th
354c0 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f  e next interatio
354d0 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
354e0 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50   will balance pP
354f0 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20  arent .         
35500 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20 62   ** use either b
35510 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
35520 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70   or balance_deep
35530 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73  er(). Until this
35540 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
35550 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66  ppens, the overf
35560 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72  low cell is stor
35570 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e  ed in the aBalan
35580 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20  ceQuickSpace[]. 
35590 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
355a0 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  er. .          *
355b0 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  *.          ** T
355c0 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
355d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
355e0 72 74 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b  rt() is to check
355f0 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20   that only a.   
35600 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
35610 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
35620 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65  _quick() is made
35630 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74   for each call t
35640 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  o this.         
35650 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66   ** function. If
35660 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76   this were not v
35670 65 72 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c  erified, a subtl
35680 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20  e bug involving 
35690 72 65 75 73 65 0a 20 20 20 20 20 20 20 20 20 20  reuse.          
356a0 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e  ** of the aBalan
356b0 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d  ceQuickSpace[] m
356c0 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20  ight sneak in.. 
356d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
356e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62        assert( (b
356f0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c  alance_quick_cal
35700 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20  led++)==0 );.   
35710 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
35720 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e  nce_quick(pParen
35730 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e  t, pPage, aBalan
35740 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20  ceQuickSpace);. 
35750 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
35760 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
35770 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
35780 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61  is case, call ba
35790 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
357a0 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20  to redistribute 
357b0 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20  cells.          
357c0 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67 65  ** between pPage
357d0 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20   and up to 2 of 
357e0 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65  its sibling page
357f0 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  s. This involves
35800 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  .          ** mo
35810 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
35820 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c  ents of pParent,
35830 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65   which may cause
35840 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20   pParent to.    
35850 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20        ** become 
35860 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
35870 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20  rfull. The next 
35880 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
35890 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20   do-loop.       
358a0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e     ** will balan
358b0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
358c0 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68  ge to correct th
358d0 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is..          **
358e0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49   .          ** I
358f0 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
35900 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
35910 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ll, the overflow
35920 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20   cell or cells. 
35930 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20           ** are 
35940 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53  stored in the pS
35950 70 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f  pace buffer allo
35960 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  cated immediatel
35970 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20  y below. .      
35980 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75      ** A subsequ
35990 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ent iteration of
359a0 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c   the do-loop wil
359b0 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 73  l deal with this
359c0 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   by.          **
359d0 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65   calling balance
359e0 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61  _nonroot() (bala
359f0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79  nce_deeper() may
35a00 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
35a10 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  ,.          ** b
35a20 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65  ut it doesn't de
35a30 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  al with overflow
35a40 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f   cells - just mo
35a50 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20  ves them to a.  
35a60 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65          ** diffe
35a70 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65  rent page). Once
35a80 20 74 68 69 73 20 73 75 62 73 65 71 75 65 6e 74   this subsequent
35a90 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
35aa0 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20  _nonroot() .    
35ab0 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d        ** has com
35ac0 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73 61  pleted, it is sa
35ad0 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  fe to release th
35ae0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
35af0 75 73 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  used by.        
35b00 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75    ** the previou
35b10 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f  s call, as the o
35b20 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74  verflow cell dat
35b30 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  a will have been
35b40 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
35b50 6f 70 69 65 64 20 65 69 74 68 65 72 20 69 6e 74  opied either int
35b60 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  o the body of a 
35b70 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72  database page or
35b80 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
35b90 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63          ** pSpac
35ba0 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
35bb0 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  to the latter ca
35bc0 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
35bd0 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20  nroot()..       
35be0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
35bf0 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c  u8 *pSpace = sql
35c00 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
35c10 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  Cur->pBt->pageSi
35c20 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ze);.          r
35c30 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
35c40 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49 64  oot(pParent, iId
35c50 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67 65  x, pSpace, iPage
35c60 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==1);.          
35c70 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
35c80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
35c90 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Free is not NULL
35ca0 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  , it points to t
35cb0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
35cc0 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 20   used .         
35cd0 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76 69     ** by a previ
35ce0 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ous call to bala
35cf0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49  nce_nonroot(). I
35d00 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a  ts contents are.
35d10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
35d20 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68 65 72  ow stored either
35d30 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61 73   on real databas
35d40 65 20 70 61 67 65 73 20 6f 72 20 77 69 74 68 69  e pages or withi
35d50 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  n the .         
35d60 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63 65     ** new pSpace
35d70 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20 6d   buffer, so it m
35d80 61 79 20 62 65 20 73 61 66 65 6c 79 20 66 72 65  ay be safely fre
35d90 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  ed here. */.    
35da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35db0 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
35dc0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
35dd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53         /* The pS
35de0 70 61 63 65 20 62 75 66 66 65 72 20 77 69 6c 6c  pace buffer will
35df0 20 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20   be freed after 
35e00 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
35e10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 61  .          ** ba
35e20 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c  lance_nonroot(),
35e30 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72 65 20   or just before 
35e40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
35e50 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76 65 72  turns, whichever
35e60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
35e70 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20  mes first. */.  
35e80 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20          pFree = 
35e90 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  pSpace;.        
35ea0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
35eb0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35ec0 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  w = 0;..      /*
35ed0 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   The next iterat
35ee0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
35ef0 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65 20  op balances the 
35f00 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  parent page. */.
35f10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
35f20 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
35f30 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
35f40 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
35f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
35f60 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
35f70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
35f80 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a  ree(pFree);.  }.
35f90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35fa0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
35fb0 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
35fc0 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20  the BTree.  The 
35fd0 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  key is given by 
35fe0 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61  (pKey,nKey).** a
35ff0 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67  nd the data is g
36000 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e  iven by (pData,n
36010 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73  Data).  The curs
36020 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
36030 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61  to.** define wha
36040 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f  t table the reco
36050 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rd should be ins
36060 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65  erted into.  The
36070 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
36080 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
36090 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
360a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49  ..**.** For an I
360b0 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c  NTKEY table, onl
360c0 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65  y the nKey value
360d0 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75   of the key is u
360e0 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
360f0 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61   ignored.  For a
36100 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c   ZERODATA table,
36110 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e   the pData and n
36120 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67  Data are both ig
36130 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
36140 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70  the seekResult p
36150 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
36160 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75 63  zero, then a suc
36170 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a  cessful call to.
36180 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  ** MovetoUnpacke
36190 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73  d() to seek curs
361a0 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79  or pCur to (pKey
361b0 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65  , nKey) has alre
361c0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66  ady.** been perf
361d0 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c  ormed. seekResul
361e0 74 20 69 73 20 74 68 65 20 73 65 61 72 63 68 20  t is the search 
361f0 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
36200 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e  (a negative.** n
36210 75 6d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f  umber if pCur po
36220 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79  ints at an entry
36230 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72   that is smaller
36240 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65   than (pKey, nKe
36250 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69  y), or.** a posi
36260 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43  tive value if pC
36270 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
36280 65 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72  etry that is lar
36290 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b  ger than .** (pK
362a0 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a  ey, nKey)). .**.
362b0 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
362c0 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
362d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
362e0 20 74 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   the caller guar
362f0 61 6e 74 65 65 73 20 74 68 61 74 0a 2a 2a 20 63  antees that.** c
36300 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
36310 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 65 78  inting at the ex
36320 69 73 74 69 6e 67 20 63 6f 70 79 20 6f 66 20 61  isting copy of a
36330 20 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f 20   row that is to 
36340 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74 65  be.** overwritte
36350 6e 2e 20 20 49 66 20 74 68 65 20 73 65 65 6b 52  n.  If the seekR
36360 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
36370 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f  is 0, then curso
36380 72 20 70 43 75 72 20 6d 61 79 0a 2a 2a 20 70 6f  r pCur may.** po
36390 69 6e 74 20 74 6f 20 61 6e 79 20 65 6e 74 72 79  int to any entry
363a0 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20   or to no entry 
363b0 61 74 20 61 6c 6c 20 61 6e 64 20 73 6f 20 74 68  at all and so th
363c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
363d0 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63  to seek.** the c
363e0 75 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65  ursor before the
363f0 20 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20   new key can be 
36400 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
36410 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
36420 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ert(.  BtCursor 
36430 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
36440 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
36450 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61  data into the ta
36460 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73  ble of this curs
36470 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  or */.  const vo
36480 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
36490 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
364a0 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  y of the new rec
364b0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
364c0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
364d0 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64  nData,  /* The d
364e0 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72  ata of the new r
364f0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
36500 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
36510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
36520 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62  ber of extra 0 b
36530 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
36540 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  o data */.  int 
36550 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20  appendBias,     
36560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
36570 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69  ue if this is li
36580 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a  kely an append *
36590 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75  /.  int seekResu
365a0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
365b0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
365c0 70 72 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61  prior MovetoUnpa
365d0 63 6b 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29  cked() call */.)
365e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
365f0 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75  t loc = seekResu
36600 6c 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  lt;          /* 
36610 2d 31 3a 20 62 65 66 6f 72 65 20 64 65 73 69 72  -1: before desir
36620 65 64 20 6c 6f 63 61 74 69 6f 6e 20 20 2b 31 3a  ed location  +1:
36630 20 61 66 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20   after */.  int 
36640 73 7a 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74  szNew = 0;.  int
36650 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
36660 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  *pPage;.  Btree 
36670 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
36680 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
36690 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
366a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
366b0 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
366c0 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
366d0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  = 0;..  if( pCur
366e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
366f0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73  _FAULT ){.    as
36700 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
36710 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
36720 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  );.    return pC
36730 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
36740 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  }..  assert( cur
36750 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
36760 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
36770 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
36780 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
36790 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
367a0 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e   && !pBt->readOn
367b0 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ly );.  assert( 
367c0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
367d0 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d  bleLock(p, pCur-
367e0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d  >pgnoRoot, pCur-
367f0 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29  >pKeyInfo!=0, 2)
36800 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
36810 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
36820 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 69 73   has been consis
36830 74 65 6e 74 2e 20 49 66 20 74 68 69 73 20 63 75  tent. If this cu
36840 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 0a  rsor was opened.
36850 20 20 2a 2a 20 65 78 70 65 63 74 69 6e 67 20 61    ** expecting a
36860 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20  n index b-tree, 
36870 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
36880 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
36890 69 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65  ing blob.  ** ke
368a0 79 73 20 77 69 74 68 20 6e 6f 20 61 73 73 6f 63  ys with no assoc
368b0 69 61 74 65 64 20 64 61 74 61 2e 20 49 66 20 74  iated data. If t
368c0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
368d0 65 6e 65 64 20 65 78 70 65 63 74 69 6e 67 20 61  ened expecting a
368e0 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74 61  n.  ** intkey ta
368f0 62 6c 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ble, the caller 
36900 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
36910 69 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ing integer keys
36920 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c 6f   with a.  ** blo
36930 62 20 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20  b of associated 
36940 64 61 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73 65  data.  */.  asse
36950 72 74 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d 28  rt( (pKey==0)==(
36960 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
36970 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
36980 68 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74  his is an insert
36990 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d   into a table b-
369a0 74 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65  tree, invalidate
369b0 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20   any incrblob . 
369c0 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   ** cursors open
369d0 20 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e   on the row bein
369e0 67 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75  g replaced (assu
369f0 6d 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72  ming this is a r
36a00 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72  eplace.  ** oper
36a10 61 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73  ation - if it is
36a20 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77   not, the follow
36a30 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e  ing is a no-op).
36a40 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d    */.  if( pCur-
36a50 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a  >pKeyInfo==0 ){.
36a60 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e      invalidateIn
36a70 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c  crblobCursors(p,
36a80 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a   nKey, 0);.  }..
36a90 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
36aa0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
36ab0 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
36ac0 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  n on this table.
36ad0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f  .  **.  ** In so
36ae0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  me cases, the ca
36af0 6c 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74  ll to btreeMovet
36b00 6f 28 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e  o() below is a n
36b10 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65  o-op. For.  ** e
36b20 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73  xample, when ins
36b30 65 72 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f  erting data into
36b40 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 75   a table with au
36b50 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74  to-generated int
36b60 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20  eger.  ** keys, 
36b70 74 68 65 20 56 44 42 45 20 6c 61 79 65 72 20 69  the VDBE layer i
36b80 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74  nvokes sqlite3Bt
36b90 72 65 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67  reeLast() to fig
36ba0 75 72 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a  ure out the .  *
36bb0 2a 20 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f  * integer key to
36bc0 20 75 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61   use. It then ca
36bd0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
36be0 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e  n to actually in
36bf0 73 65 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64  sert the .  ** d
36c00 61 74 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74  ata into the int
36c10 6b 65 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  key B-Tree. In t
36c20 68 69 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f  his case btreeMo
36c30 76 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65  veto() recognize
36c40 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  s.  ** that the 
36c50 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
36c60 79 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73  y where it needs
36c70 20 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72   to be and retur
36c80 6e 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  ns without.  ** 
36c90 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20  doing any work. 
36ca0 54 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69  To avoid thwarti
36cb0 6e 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  ng these optimiz
36cc0 61 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d  ations, it is im
36cd0 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74  portant.  ** not
36ce0 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75   to clear the cu
36cf0 72 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  rsor here..  */.
36d00 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
36d10 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
36d20 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
36d30 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
36d40 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 21 6c  urn rc;.  if( !l
36d50 6f 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  oc ){.    rc = b
36d60 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
36d70 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
36d80 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b 0a  endBias, &loc);.
36d90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36da0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
36db0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
36dc0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
36dd0 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74   || (pCur->eStat
36de0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
36df0 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20  D && loc) );..  
36e00 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
36e10 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
36e20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
36e30 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b  ge->intKey || nK
36e40 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
36e50 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  t( pPage->leaf |
36e60 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | !pPage->intKey
36e70 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 49   );..  TRACE(("I
36e80 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20  NSERT: table=%d 
36e90 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d  nkey=%lld ndata=
36ea0 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22  %d page=%d %s\n"
36eb0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ,.          pCur
36ec0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79  ->pgnoRoot, nKey
36ed0 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  , nData, pPage->
36ee0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
36ef0 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72  loc==0 ? "overwr
36f00 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72  ite" : "new entr
36f10 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y"));.  assert( 
36f20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
36f30 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  .  allocateTempS
36f40 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77  pace(pBt);.  new
36f50 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70  Cell = pBt->pTmp
36f60 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77  Space;.  if( new
36f70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
36f80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
36f90 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
36fa0 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c  (pPage, newCell,
36fb0 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61   pKey, nKey, pDa
36fc0 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f  ta, nData, nZero
36fd0 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28  , &szNew);.  if(
36fe0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
36ff0 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  nsert;.  assert(
37000 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65   szNew==cellSize
37010 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65  Ptr(pPage, newCe
37020 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
37030 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f   szNew<=MX_CELL_
37040 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
37050 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
37060 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
37070 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20   if( loc==0 ){. 
37080 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20     u16 szOld;.  
37090 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50    assert( idx<pP
370a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
370b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
370c0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
370d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
370e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
370f0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
37100 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c     }.    oldCell
37110 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
37120 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28  e, idx);.    if(
37130 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
37140 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
37150 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
37160 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
37170 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
37180 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
37190 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
371a0 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
371b0 43 65 6c 6c 29 3b 0a 20 20 20 20 64 72 6f 70 43  Cell);.    dropC
371c0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
371d0 73 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20  szOld, &rc);.   
371e0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
371f0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  nd_insert;.  }el
37200 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20  se if( loc<0 && 
37210 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
37220 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
37230 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
37240 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
37250 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
37260 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
37270 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
37280 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 69 6e 73  eaf );.  }.  ins
37290 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ertCell(pPage, i
372a0 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e  dx, newCell, szN
372b0 65 77 2c 20 30 2c 20 30 2c 20 26 72 63 29 3b 0a  ew, 0, 0, &rc);.
372c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
372d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
372e0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61  ->nCell>0 || pPa
372f0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
37300 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65  );..  /* If no e
37310 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
37320 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61   and pPage has a
37330 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
37340 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20   call balance() 
37350 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72  .  ** to redistr
37360 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ibute the cells 
37370 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e  within the tree.
37380 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29   Since balance()
37390 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74   may move.  ** t
373a0 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20  he cursor, zero 
373b0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  the BtCursor.inf
373c0 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75  o.nSize and BtCu
373d0 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20  rsor.validNKey. 
373e0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20   ** variables.. 
373f0 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75   **.  ** Previou
37400 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  s versions of SQ
37410 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65  Lite called move
37420 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65  ToRoot() to move
37430 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a   the cursor.  **
37440 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f   back to the roo
37450 74 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63  t page as balanc
37460 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61  e() used to inva
37470 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65  lidate the conte
37480 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75  nts.  ** of BtCu
37490 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e  rsor.apPage[] an
374a0 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  d BtCursor.aiIdx
374b0 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  []. Instead of d
374c0 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20  oing that,.  ** 
374d0 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73  set the cursor s
374e0 74 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64  tate to "invalid
374f0 22 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f  ". This makes co
37500 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72  mmon insert oper
37510 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67  ations.  ** slig
37520 68 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a  htly faster..  *
37530 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20  *.  ** There is 
37540 61 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70  a subtle but imp
37550 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ortant optimizat
37560 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68  ion here too. Wh
37570 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a  en inserting.  *
37580 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72  * multiple recor
37590 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65  ds into an intke
375a0 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61  y b-tree using a
375b0 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28   single cursor (
375c0 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70  as can.  ** happ
375d0 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  en while process
375e0 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49  ing an "INSERT I
375f0 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20  NTO ... SELECT" 
37600 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20  statement), it. 
37610 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65   ** is advantage
37620 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65  ous to leave the
37630 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
37640 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
37650 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62  ry in.  ** the b
37660 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c  -tree if possibl
37670 65 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  e. If the cursor
37680 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
37690 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20  g to the last.  
376a0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
376b0 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e  table, and the n
376c0 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64  ext row inserted
376d0 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20   has an integer 
376e0 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20  key.  ** larger 
376f0 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
37700 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69   existing key, i
37710 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
37720 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a   insert the.  **
37730 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65   row without see
37740 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e  king the cursor.
37750 20 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62   This can be a b
37760 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ig performance b
37770 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75  oost..  */.  pCu
37780 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
37790 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
377a0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
377b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
377c0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
377d0 77 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61  w ){.    rc = ba
377e0 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20  lance(pCur);..  
377f0 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73    /* Must make s
37800 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ure nOverflow is
37810 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65   reset to zero e
37820 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e  ven if the balan
37830 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c  ce().    ** fail
37840 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61  s. Internal data
37850 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
37860 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ption will resul
37870 74 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20  t otherwise. .  
37880 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74    ** Also, set t
37890 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
378a0 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73  to invalid. This
378b0 20 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f   stops saveCurso
378c0 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20  rPosition().    
378d0 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
378e0 6f 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65  o save the curre
378f0 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  nt position of t
37900 68 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20  he cursor.  */. 
37910 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
37920 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f  pCur->iPage]->nO
37930 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
37940 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
37950 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
37960 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
37970 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
37980 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c  >iPage]->nOverfl
37990 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e  ow==0 );..end_in
379a0 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
379b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
379c0 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
379d0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
379e0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
379f0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
37a00 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
37a10 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61  a arbitrary loca
37a20 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
37a30 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
37a40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
37a50 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
37a60 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
37a70 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
37a80 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
37a90 20 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20     .  int rc;   
37aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37ac0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
37ad0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
37ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37af0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64      /* Page to d
37b00 65 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20  elete cell from 
37b10 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
37b20 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  ar *pCell;      
37b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
37b40 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20  nter to cell to 
37b50 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
37b60 69 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20  iCellIdx;       
37b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b80 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c   /* Index of cel
37b90 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
37ba0 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b   int iCellDepth;
37bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37bc0 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f        /* Depth o
37bd0 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e  f node containin
37be0 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61  g pCell */ ..  a
37bf0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
37c00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
37c10 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
37c20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
37c30 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
37c40 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
37c50 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
37c60 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
37c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61   );.  assert( ha
37c80 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
37c90 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70  eLock(p, pCur->p
37ca0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70  gnoRoot, pCur->p
37cb0 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29  KeyInfo!=0, 2) )
37cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73  ;.  assert( !has
37cd0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
37ce0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29   pCur->pgnoRoot)
37cf0 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
37d00 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  (pCur->aiIdx[pCu
37d10 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d  r->iPage]>=pCur-
37d20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
37d30 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20  age]->nCell) .  
37d40 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
37d50 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
37d60 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72  ALID).  ){.    r
37d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
37d80 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  OR;  /* Somethin
37d90 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e  g has gone awry.
37da0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   */.  }..  /* If
37db0 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74   this is a delet
37dc0 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72  e operation to r
37dd0 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d  emove a row from
37de0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
37df0 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  .  ** invalidate
37e00 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
37e10 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
37e20 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65  e row being dele
37e30 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ted.  */.  if( p
37e40 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
37e50 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
37e60 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
37e70 73 28 70 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  s(p, pCur->info.
37e80 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
37e90 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43   iCellDepth = pC
37ea0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65  ur->iPage;.  iCe
37eb0 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  llIdx = pCur->ai
37ec0 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b  Idx[iCellDepth];
37ed0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
37ee0 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70  >apPage[iCellDep
37ef0 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  th];.  pCell = f
37f00 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
37f10 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20  CellIdx);..  /* 
37f20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  If the page cont
37f30 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79  aining the entry
37f40 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f   to delete is no
37f50 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d  t a leaf page, m
37f60 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
37f70 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65  sor to the large
37f80 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
37f90 74 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61  tree that is sma
37fa0 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74  ller than.  ** t
37fb0 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64  he entry being d
37fc0 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c  eleted. This cel
37fd0 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74  l will replace t
37fe0 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  he cell being de
37ff0 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20  leted.  ** from 
38000 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
38010 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73  e. The 'previous
38020 27 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20  ' entry is used 
38030 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64  for this instead
38040 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65  .  ** of the 'ne
38050 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68  xt' entry, as th
38060 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
38070 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72   is always a par
38080 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75  t of the.  ** su
38090 62 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79  b-tree headed by
380a0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
380b0 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e  of the cell bein
380c0 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
380d0 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e  makes.  ** balan
380e0 63 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f  cing the tree fo
380f0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65  llowing the dele
38100 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73  te operation eas
38110 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ier.  */.  if( !
38120 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
38130 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
38140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38150 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
38160 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ur, &notUsed);. 
38170 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
38180 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
38190 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
381a0 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
381b0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
381c0 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 66 6f   this table befo
381d0 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 61  re.  ** making a
381e0 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
381f0 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67 65 20  . Make the page 
38200 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
38210 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20 2a 2a  ntry to be .  **
38220 20 64 65 6c 65 74 65 64 20 77 72 69 74 61 62 6c   deleted writabl
38230 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61 6e 79  e. Then free any
38240 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
38250 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
38260 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79 20  the .  ** entry 
38270 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f  and finally remo
38280 76 65 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65  ve the cell itse
38290 6c 66 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  lf from within t
382a0 68 65 20 70 61 67 65 2e 20 20 0a 20 20 2a 2f 0a  he page.  .  */.
382b0 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
382c0 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
382d0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
382e0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
382f0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
38300 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
38310 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
38320 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
38330 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 63  urn rc;.  rc = c
38340 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
38350 70 43 65 6c 6c 29 3b 0a 20 20 64 72 6f 70 43 65  pCell);.  dropCe
38360 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49  ll(pPage, iCellI
38370 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
38380 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 2c 20 26  pPage, pCell), &
38390 72 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  rc);.  if( rc ) 
383a0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
383b0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 64 65 6c   If the cell del
383c0 65 74 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63  eted was not loc
383d0 61 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70  ated on a leaf p
383e0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
383f0 72 73 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75 72  rsor.  ** is cur
38400 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
38410 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  to the largest e
38420 6e 74 72 79 20 69 6e 20 74 68 65 20 73 75 62 2d  ntry in the sub-
38430 74 72 65 65 20 68 65 61 64 65 64 0a 20 20 2a 2a  tree headed.  **
38440 20 62 79 20 74 68 65 20 63 68 69 6c 64 2d 70 61   by the child-pa
38450 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  ge of the cell t
38460 68 61 74 20 77 61 73 20 6a 75 73 74 20 64 65 6c  hat was just del
38470 65 74 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74  eted from an int
38480 65 72 6e 61 6c 0a 20 20 2a 2a 20 6